Вот безопасное решение UTF-8, которое работает не только с правильно отформатированными документами, но и с фрагментами документов.
Требуется mb_convert_encoding, потому что loadHtml (), похоже, имеет ошибку с UTF-8 кодирования (см. здесь и здесь ).
mb_substr обрезает тег body из вывода, таким образом вы возвращаете исходное содержимое без дополнительной разметки.
<?php
$html = '<p>Match this text and replace it</p>
<p>Don\'t <a href="/">match this text</a></p>
<p>We still need to match this text and replace itŐŰ</p>
<p>This is <a href="#">a link <span>with <strong>don\'t match this text</strong> content</span></a></p>';
$dom = new DOMDocument();
// loadXml needs properly formatted documents, so it's better to use loadHtml, but it needs a hack to properly handle UTF-8 encoding
$dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"));
$xpath = new DOMXPath($dom);
foreach($xpath->query('//text()[not(ancestor::a)]') as $node)
{
$replaced = str_ireplace('match this text', 'MATCH', $node->wholeText);
$newNode = $dom->createDocumentFragment();
$newNode->appendXML($replaced);
$node->parentNode->replaceChild($newNode, $node);
}
// get only the body tag with its contents, then trim the body tag itself to get only the original content
echo mb_substr($dom->saveXML($xpath->query('//body')->item(0)), 6, -7, "UTF-8");
Ссылки:
1.найти и заменить ключевые слова гиперссылками во фрагменте html через php dom
2.Regex / DOMDocument - сопоставить и заменить текст, отсутствующий в ссылке
3.проблема php с русским языком
4.Почему DOM меняет кодировку?
Я прочитал десятки ответов в теме, поэтому мне жаль, если я кого-то забыл (пожалуйста, прокомментируйте это, и я добавлю ваши также в этом случае).
Спасибо за Гордона и все еще за комментирование моего другого ответа .