2010-08-17 9 views
0

J'écris une fonction PHP pour vérifier l'existence de mauvais mots entiers (garder à l'esprit le mot entier pas sous-chaînes) et aussi souligner les mots entiers dans une chaîne donnée.preg_replace ne fonctionne pas pour utf-8 texte en arabe

 
function badwordChecherAndHighLighter($str,$replace){ 
// $replace=1 will Highlight 
// $replace=0 will Check the existence of any badwords 

$result = mysql_query("SELECT settings_badwords_en,settings_badwords_ar FROM settings_badwords WHERE settings_badwords_status=1") or die(mysql_error()); 

// i dont create an array, may create overhead, so i directly apply in preg_replace 

if($replace==1){ 
while($row = mysql_fetch_row($result)) 
{ 
//$str=preg_replace('/'.$row[0].'/i', str_repeat("*",strlen($row[0])), $str); 
$str=preg_replace('/\b('.$row[0].'\b)/i',"" .$row[0] . "" , $str); 
$str=preg_replace('/\b('.$row[1].'\b)/i',"" .$row[1] . "" , $str); 
} 
return $str; 
}else{ 

while($row = mysql_fetch_row($result)) 
{ 
if(preg_match('/\b('.$row[0].'\b)/i',$str)) return 1; 
if(preg_match('/\b('.$row[1].'\b)/i',$str)) return 1; 
} 
return 0; 
} 
} 

// $row[1] conatin Arabic bad Words, and $row[0] contain English bad words. 

Cette fonction donne des résultats corrects sous Windows OS, WAMP5 1.7.3 pour l'arabe et l'anglais.

Mais sur le serveur Web Cela ne fonctionne que pour les mots anglais, et non pour l'arabe. Par conséquent, si un texte en arabe est attribué à cette fonction, il est impossible de vérifier l'existence d'un quelconque mot incorrect et de mettre en évidence un mot arabe.

J'ai cherché et essayé beaucoup d'options comprenant \ u mais aucune erreur, aucun succès.

Alors aidez s'il vous plaît.

Répondre

3

Le \ b n'est pas compatible avec les caractères utf8. Essayez ceci:

preg_match('/(?<=^|[^\p{L}])' . preg_quote($utf8word,'/') . '(?=[^\p{L}]|$)/ui',$utf8string); 
+0

'(? Gumbo

+0

@Gumbo: Votre recherche de lettres Unicode est presque correcte - elle ne tient pas compte des conditions de début de chaîne et de fin de chaîne. – turbod

+0

@turbod: Bien sûr. Si la position actuelle est le début ou la fin de la chaîne, il n'y a pas de lettre Unicode avant ou après la position actuelle. – Gumbo