2016-08-08 4 views
-1

PHP를 사용하면 문자열에 다양한 단어와 패턴이 있는지 테스트하려고하지만 특정 단어를 일치 시키려고 할 때 왜 이상한 행동을하는지 알 수 없습니다.preg_match가 리터럴 단어를 찾지 못하는 이유는 무엇입니까?

예 1 : 왜 다음 중 하나가 반환되지 않습니까?

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)'; 

$result = preg_match('/(string)/i', $test, $matches); 

$ "String"이라는 단어가 제목 문자열에 있어도 결과는 항상 위의 경우 0입니다.

예 2 : 그러나, 이제 내가 약간 다음에 내 정규식을 변경할 가정 해 봅시다 : $ 결과에 대한 하나의

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)'; 
$result = preg_match('/st.+(ring)/i', $test, $matches); 

위의 반환 값. 내가 "문자열"이라는 단어를 분리 된 부분으로 나눌 때처럼 나는 성냥을 얻을 수있다.

예 3 : 나는 약간이 예에서 정규 표현식을 수정할 때 다시 한번, 그것은 또한 제로 반환하지만 나는 이유는 확실하지 않다 :

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)'; 
$result = preg_match('/(tring)/i', $test, $matches); 

문자 등의 순서에 일치하도록 시도 "tring"은 0을 반환하지만 "ring"에서 일치하는 경우 1을 반환합니다. 그러나 "tring"은 특별한 단어 나 예약어처럼 들리지 않습니다!

이 동작은 "document"및 "unescape"와 같은 다양한 단어에도 동일하며 많은 다른 단어가있을 것입니다.

정규 표현식 엔진이 일부 단어를 다르게 취급하고 있다고 가정합니다. 예약어 나 특수 문자가 어떤 식 으로든 사용 되었기 때문일 수 있지만 위의 동작에 대한 공식 설명을 찾을 수 없었기 때문입니다.

내가 정말로 분명한 것을 놓친다면 사과하고 누군가 내게 설명해 주시면 감사하겠습니다. 많은 감사.

답변

1

첫 정규식이 괜찮다고 생각합니다. 여기를 봐 https://regex101.com/r/tO9vN8/1

하지만 charset에 문제가있는 것처럼 보입니다.이 표현식을 다시 써야했습니다.이 사이트에서 복사하면 정규식이 일치하지 않습니다.

올바른 방향이되기를 바랍니다.

+0

당신 말이 맞습니다. 메모장에 피사체 문자열을 붙여 넣었을 때 이전에 볼 수 없었던 다양한 숨겨진 문자를 볼 수있었습니다. "String"이라는 단어가 "St? ring"으로 나타납니다. 그러므로 regex와 preg_match는 잘 동작합니다. 고마워! – user3109890

관련 문제