Замена слов в блоке кода HTML без изменения HTML

Допустим, у меня есть блок HTML, в котором я хочу найти и заменить содержимое, прежде чем выводить его на экран.

Как мне убедиться, что я не изменяю HTML, а просто меняю содержимое (в PHP).

Например, если бы у меня было это:

<div class='Hello'>Hello</div>

и я хотел заменить все слова «Hello» в содержании на «Hi», я хотел бы получить такой результат:

<div class='Hello'>Hi</div>

В данный момент я использую preg_replace, например

$new_code = preg_replace(array("/Hello/"), array("Hi"), $code);

Но это дало бы мне результат

<div class='Hi'>Hi</div>

0

Решение

Не используйте регулярные выражения для поиска текста в HTML, используйте вместо этого DOM-парсер:

Вы могли бы использовать DomDocument но будьте осторожны, он будет делать странные вещи с частичным HTML, но вот пример, чтобы вы начали:

$dom = new DOMDocument();
$dom->loadHTML("<html><body><p>Hello</p></body></html>");

$els = $dom->getElementsByTagName('*');

foreach ( $els as $el ) {

if (preg_replace("/Hello/","Hi",$el->nodeValue))
{
$el->nodeValue =preg_replace("/Hello/","Hi",$el->nodeValue);
}

}

echo $dom->saveHTML();

или же Простой HTML DOM может удовлетворить ваши потребности:

Пример с сайта:

$html = str_get_html('<div class='Hello'>Hello</div>');

$html->find('div', 0)->innertext = 'Hi';

echo $html;
1

Другие решения

Если вы с нетерпением ждете, чтобы перейти от Hello в Hi затем,

$new_code = preg_replace(array("/\>Hello/"), array(">Hi"), $code);
0

Попробуйте использовать это утверждение (см. Ответ на этот вопрос) только для совпадения текста, который встречается между > а также <:

$new_code = preg_replace(array("/(Hello)(?=[^>]*(<|$))/"), array("Hi"), $code);
0

Попробуй это:

<?PHP

$html = '<div class="HeLLo" id="HEllO">Hello how to say "hEllo"for heLlo world in a helLo world of hellO</div>';

echo preg_replace('/(hello)(?![^>](\s*\w+=".*")*\s*>)/i', "Hi", $html);

?>
0
По вопросам рекламы [email protected]