2011-09-14 5 views
0

나는 다음과 같은 오류PHP, 오류 preg_match_all 오류 알 수없는 수정 자?

[13-Sep-2011 07:26:28] PHP Warning: preg_match_all() [<a 
href='function.preg-match-all'>function.preg-match-all</a>]: Unknown 
modifier 'w' in D:\domains\wwwroot\php\search.php on line 274 

을 검색의 가치 얻고있다 "태평양 표준시를 복구"

$text1 = $result['ProgramName'] . " " . $result['ProgramVersion']; 
$keywords1 = explode(" ",stripslashes($search)); 
foreach ($keywords1 as $k){ 
    preg_match_all("/$k/i",$text1,$matches); 
    foreach ($matches[0] as $m){ 
    $text1 = preg_replace("/$m/", '<span class="highlight">'.$m.'</span>', $text1); 
    } 
} 

나는 문제가 무엇인지 정말 꽤 당황 해요?

+0

이며, 다음 (preg_replace이다에서) 다시 일치하는 모든 일을? – salathe

답변

0

키워드 중 하나에 슬래시가있다.

이렇게하면 정규식이 그 슬래시로 너무 일찍 종료되고 다음 문자 (이 경우 w)가 유효하지 않은 수정 자로 해석됩니다.

해결 방법 : 정규식에 키워드를 추가하기 전에 키워드에 preg_quote() (으)로 전화하십시오.

1

$ k 또는 $ m은 아마도 /w을 포함합니다. 당신은 그들을 도망쳐 야한다

$m = str_replace('/', '\\/', $m); 
$k = str_replace('/', '\\/', $k); 
+1

'str_replace()'대신'preg_quote()'를 사용하십시오. – salathe

1

당신은 임의의 정규식 문자열을 만들 때 어떤 $ k가 그때 그때 있었는지 삽입합니다. $ k에 정규식 메타 문자가 포함되어 있으면 sql injection 공격과 동일한 정규식이 사용됩니다. 당신은 $ k를 살균하는 preg_quote()를 사용할 필요가 왜 일치하는 첫 번째

preg_match_all("/" . preg_quote($k) . "/i", $text1, $matches);'