2013-05-07 1 views
0

단어의 블랙리스트를 검사하기 위해 문자열을 검사하려고합니다. 별표와 같은 특수 문자를 처리하기 위해 preg_quote을 사용했지만 달러 기호로는 작동하지 않습니다.PHP preg_match 및 preg_quote가 달러 기호와 일치하지 않습니다

$string_to_check = 'wordcontaining$'; 
$naughty_words = array('wordcontaining$', 'a*differentstring'); 
if(isset($naughty_words)){ 
    foreach($naughty_words as $word){ 
     if (preg_match('/\b'.preg_quote($word).'\b/i',$string_to_check)) { 
      var_export(array('found'=> true, 'word'=>$word)); 
     } 
    } 
} 

내가

array (
    'found' => true, 
    'word' => 'wordcontaining$', 
) 

를 반환하는 기대하지만 불행히도 그렇지 않은 : 여기

내가 봤네 테스트입니다. $string_to_check = 'a*differentstring'을 설정하면 모든 것이 예상대로 작동합니다.

나는 여기 아주 명백한 무엇인가 놓쳤는가?

+0

같은 것을 사용할 필요가

일치하지 않을 수 있습니다 '\ b'이 당신의 정규식에서 무엇을하고 있습니까? – Rikesh

+0

올바르게 입력했음을 기억하면 (예 : 코딩 한 지 오래되었습니다.) 단어 전체를 검색합니다. 즉, 블랙리스트 단어가 더 긴 단어의 중간에 나타나면 일치하지 않습니다. – Josh

+0

\ b는 너비가 0 인 단어 경계입니다 (나는'($ | \ W | ^)'과 동일하다고 생각합니다). preg_quote의 결과를 내보내기하여 달러 기호를 올바르게 이스케이프하는지 확인할 수 있습니까? – Adrian

답변

1

는 (단어) 승 \ 사이의 위치와 \의 W (비 워드) A-ZA-Z0-9_ 같은 w는 \

일치 ]를 $과 공간이 모두 비 단어입니다, 그래서 'naughty_word'는 기호로 시작하거나 끝나는 경우 표현식은

preg_match('/\s*+'.preg_quote($word).'\s*+/i',$string_to_check) 
1

그래서 위의 내 의견에 따라 정규식에서 두 번째 추가 \b을 제거해야합니다. B \

DEMO.

+0

불행히도 위의 주석에 따라 'wordcontaining $ aaa'가 의도하지 않은 유효한 단어가됩니다. – Josh

관련 문제