2016-02-07 2 views
0

Этот код используется для удаления плохих слов из текста, введенного пользователями на форуме. Как-то этот код неправильно интерпретируется и удаляет строку в пустую. Кто-то знает, что случилось. Работал отлично до php5.6Код PHP7 сейчас не работает

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

Это не мой код я не могу понять процедуру позади str_replace с SubStr и 2 preg_replace. Если бы кто-то мог превратить это в код с функцией обратного вызова или, по крайней мере, рабочий, он сделает меня счастливым.

+0

Цитирование из [PHP Docs] (http://www.php.net/manual/en/function.preg-replace.php): 'Как РНР 5.5.0 E_DEPRECATED ошибки уровня излучается при передаче в модификаторе «\ e». Начиная с PHP 7.0.0 E_WARNING выдается в этом случае, а модификатор «\ e» не действует ». - Используйте [preg_replace_callback()] (http://www.php.net/manual/en/function.preg-replace -callback.php). –

+0

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

+0

Не используйте '@', это не поможет вам. Вероятно, это помешало вам осознать предыдущее осуждение. – chris85

ответ

1

Вы можете заменить его:

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

Однако, я сомневаюсь, что этот код очень водонепроницаемый, так как он не принимает во внимание словоразделов и если искомое слово или нет между <..> , и поскольку он выглядит как дрянной подход к редактированию текстовых частей в HTML-коде.

Подход DOM, вероятно, лучше. Что-то вроде:

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();