2011-09-14 3 views
0

Je reçois l'erreur suivantePHP, Erreur preg_match_all erreur modificateur inconnu?

[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 

La valeur de recherche est « réparer un pst » ce

$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); 
    } 
} 

Je suis vraiment assez perplexe le problème?

+0

Pourquoi êtes-vous d'abord correspondant, puis en faisant tout ce travail correspondant à nouveau (en preg_replace)? – salathe

Répondre

0

Un des mots-clés contient une barre oblique. Cela provoque votre terminaison d'expression régulière prématurément (à cette barre oblique) et le caractère suivant (dans ce cas, w) est interprété comme un modificateur non valide.

Solution: Appelez le preg_quote() sur vos mots clés avant de les ajouter à la regex.

1

$ k ou $ m comprend /w probablement. Vous devez leur échapper

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

Utilisez 'preg_quote()' plutôt que 'str_replace()'. – salathe

1

Vous créez des chaînes regex arbitraires en insérant tout ce que $ k se trouve être à la fois. Si $ k contient des méta-caractères regex, vous obtiendrez l'équivalent regex des attaques par injection sql. Vous devez utiliser preg_quote() pour aseptiser $ k:

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