구분 기호는 영숫자 또는 백 슬래시 및 preg_match가 아니어야합니다.


88

이 코드가 있습니다.

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches);
echo $matches[1];

메신저가 실행되면 다음 오류가 반환됩니다.

경고 : preg_match () [function.preg-match] : 구분 기호는 영숫자 또는 백 슬래시가 아니어야합니다.


2
다른 사람들에게 도움이 될 수있는 참고로, 모든 인수를 preg_match()변수로 전달하는 경우 함수 호출에서 실수로 변수의 순서가 섞이지 않도록해야합니다. 이는 거의 확실히 동일한 결과를 초래할 것입니다. 오류가 나타납니다.
bluebinary

1
당신은 당신의 정규 표현식 문자열에 구분이 필요합니다
기 Jéy에게

2
사용$pattern = "/My name is '(.*)' and im fine/";
gk.

답변:


134

패턴에 대한 구분자가 필요합니다. 다음과 같이 패턴의 시작과 끝에 추가해야합니다.

$pattern = "/My name is '(.*)' and im fine/";  // With / as a delimeter 

1
정규식을 감싸기 위해 큰 따옴표를 사용하지 않도록주의하십시오. 그렇지 않으면 일부 \ + 문자 조합 (예 : \l줄 바꿈)이 해당 문자로 변환되어 예상과 ​​다른 식을 생성 할 수 있습니다. 작은 따옴표를 사용하십시오. php Strings description을 참조하십시오 .
Patanjali

이 예에서 문자열에는 작은 따옴표가 포함되어 있으므로 큰 따옴표를 사용하여 묶는 것이 더 쉽습니다 ( \'작은 따옴표로 묶인 경우 필요한 이스케이프 방지 ).

나는 예를 보는 사람들이 그것을 다른 상황으로 확장하면 일어날 수있는 예상치 못한 결과를 깨닫지 못하고 스스로를 '쿠키 컷'하는 것으로 받아 들일 수 있기 때문에 일반적인 논평을하고 있었다. 불행히도 내 의견을 더 구체적으로 변경할 수 없습니다.
Patanjali

68

해결책 (다른 답변에서 언급하지 않은 것-적어도 내가 처음 작성했을 때)은 PHP가 구분 기호를 참조 할 때 코드에서 볼 수있는 구분 기호 (따옴표)를 참조하지 않고 다음 문자열 내부의 문자. (사실 나는 이것이 어떤 문서에서도 언급 된 것을 본 적이 없습니다. 예제에서 봐야합니다.) 따라서 다른 많은 언어에서 익숙한 것과 같은 정규식 구문을 사용하는 대신 :

/something/

PHP는 문자열을 사용한 다음 문자열 내부에서 다른 구분 기호 를 찾습니다 .

'/something/'

PHP가 참조하는 구분 기호는 /문자 쌍이 아닌 '문자 쌍입니다 . 따라서를 작성 'something'하면 PHP는 s의도 된 구분자로 사용되며 구분자로 영숫자 문자를 사용할 수 없다고 불평합니다.

따라서 (예를 들어) an i을 전달하여 대 / 소문자 구분없는 일치를 원한다는 것을 표시하려면 문자열 내부에 전달하지만 정규식 구분 기호 외부에 전달합니다.

'/something/i'

/구분 기호가 아닌 다른 것을 사용하려는 경우 URL과 일치하고 모든 슬래시를 이스케이프 할 필요가없는 경우와 같이 할 수 있습니다.

'~something~'

1
@Gruber : 감사합니다! ), 당신은 항상 모든 친구에게 링크를 보내 그들이 그것을 찬성 투표하도록 할 수 있습니다
우상 파괴자

1
어떤 문서가 설명하지 않는지 설명 .. +1 감사합니다!
Ju Oliveira

가장 높은 찬성 답변은 이것과 동일하지만 이것이 왜 정답 인지 이해하게되어 감사합니다 . +1 감사합니다!
Eclectic

21

식에 대한 구분 기호를 지정해야합니다. 구분 기호는 표현식의 시작과 끝에 사용되는 특수 문자로 표현식이 어느 부분인지를 나타냅니다. 이를 통해 수식어와 인터프리터를 사용하여 표현식과 수식어를 알 수 있습니다. 오류 메시지에서 알 수 있듯이 백 슬래시는 이스케이프 문자이므로 구분 기호는 백 슬래시가 될 수 없습니다.

$pattern = "/My name is '(.*)' and im fine/";

동일한 예제 아래에 있지만 i대소 문자를 구분하지 않고 일치 하는 수정자가 있습니다.

$pattern = "/My name is '(.*)' and im fine/i";

보시다시피,는 i슬래시 밖에 있으므로 수정 자로 해석됩니다.

또한 슬래시 문자 (/)를 구분 기호로 사용하는 경우 정규식에서 /를 추가로 사용하는 경우 이스케이프해야합니다 (있는 경우).


7

패턴에는 구분 기호가 있어야합니다. 구분 기호는 슬래시 (/) 또는 영숫자가 아닌 문자 (#, $, *, ...) 일 수 있습니다. 예

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";  


0

원래 코드 예제와 관련이 없을 수도 있지만 "구분자는 영숫자 또는 백 슬래시가 아니어야합니다."라는 오류가 표시되고 여기에서 Google 표시를했습니다. 이유 : preg_match에 대한 매개 변수 순서를 혼합했습니다. 패턴이 두 번째 매개 변수이고 일치 할 문자열이 첫 번째입니다. 조심해 :)


-2

이것으로 시도하십시오

 $pattern = "/My name is '\(.*\)' and im fine/"; 

왜 괄호를 이스케이프합니까?
Ki Jéy

1
@kiJey. OP의 상황에서 그들은 이름을 추출하기를 원했기 때문에 일치하는 데 괄호가 필요하므로 이스케이프해서는 안됩니다. 이것이 제가 그것을 반대하는 이유입니다.
Patanjali
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.