2011-09-14 9 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 

を検索の値がされて取得しています「PSTを修復する」

$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インジェクション攻撃に相当する正規表現になります。あなたは$ kをサニタイズするpreg_quote()を使用する必要がありますなぜあなたは、最初に一致

preg_match_all("/" . preg_quote($k) . "/i", $text1, $matches);' 
関連する問題