2016-02-07 1 views
0

Ce code est utilisé pour supprimer les mots indésirables d'un texte saisi par les utilisateurs sur un forum. D'une manière ou d'une autre, ce code n'est pas correctement interprété et supprimera la chaîne à vide. Quelqu'un sait ce qui ne va pas. A travaillé bien jusqu'à ce que php5.6Le code PHP7 ne fonctionne plus maintenant

$message = str_replace('\"', '"', substr(@preg_replace('#(\>(((?' . '>([^><]+|(?R)))*)\<))#se', "@preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1)); 

Ce n'est pas mon code je ne peux pas vraiment comprendre la procédure derrière la str_replace avec preg_replace substr et 2. Si quelqu'un pouvait transformer cela en un code avec fonction de rappel ou au moins un travail qui me rendrait heureux.

+0

Je cite le (http://www.php.net/manual/en/function.preg-replace.php) [PHP Docs]: 'A partir de PHP 5.5.0 erreur de niveau E_DEPRECATED est émis en passant dans le modificateur "\ e". A partir de PHP 7.0.0, E_WARNING est émis dans ce cas et le modificateur "\ e" n'a aucun effet. '- Utilisez [preg_replace_callback()] (http://www.php.net/manual/fr/function.preg-replace -callback.php) à la place. –

+0

http://php.net/manual/fr/function.error-reporting.php –

+0

N'utilisez pas '@' cela ne vous aidera pas. Cela vous empêchait probablement d'être conscient de la dépréciation précédente. – chris85

Répondre

1

Vous pouvez le remplacer par:

$message = preg_replace_callback('~(?<=>|^)[^<>]*+(?=<|$)~', 
           function ($m) use ($orig_word, $replacement_word) { 
    return str_replace ($orig_word, $replacement_word, $m[0]); 
}, $message); 

Cependant, je doute que ce code est très imperméable à l'eau, car il ne tient pas compte des limites de mot et si le mot recherché est ou non entre <..> , et comme il ressemble à une approche de merde pour modifier des parties de texte en code HTML.

Une approche DOM est probablement meilleure. Quelque chose comme:

libxml_use_internal_errors(true) 

$dom = new DOMDocument; 
$dom->loadHTML('<div>' . $message . '</div>', LIBXML_HTML_NO_IMPLIED, LIBXML_HTML_NO_DEFDTD); 
$xp = new DOMXPath($dom); 

$textNodes = $xp->query('//text()'); 

foreach($textNodes as $textNode) { 
    $newText = str_replace($orig_word, $replacement_word, $textNode->nodeValue); 
    // or better if $orig_word contains only word characters: 
    // $newText = preg_replace("~\b$orig_word\b~", $replacement_word, $textNode->nodeValue); 

    $textNode->parentNode->replaceChild($dom->createTextNode($newText), $textNode); 
} 

$message = ''; 

foreach ($dom->documentElement->childNodes as $childNode) 
    $message .= $childNode->saveHTML(); 

libxml_clear_errors();