str_replace в определенных тегах HTML только

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

Там какой-либо путь состоит в том, чтобы только применить функцию str_replace к определенным тегам HTML? Особенно: p, h1, h2, h3, H-4, h5

Править:

Бит кода, который имеет значение:

 $yay = str_ireplace($find, $replace , $html); 

аплодисменты и заранее спасибо за любые ответы.

РЕДАКТИРОВАНИЕ - ДАЛЬНЕЙШЕЕ РАЗЪЯСНЕНИЕ:

$find и $replace являются массивами, содержащими слова, которые будут найдены и заменены (соответственно). $html является строкой, содержащей весь HTML-код.

хороший пример его падающий вдребезги был бы то, если бы я должен был найти и заменить слово, которое произошло в, например, доменное имя. Таким образом, если я хотел заменить слово 'шляпа' 'сыром'. Любое происшествие полного пути как

www.worldofhat.com/images/monkey.jpg был бы заменен: www.worldofcheese.com/images/monkey.jpg

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

1
задан DrShamoon 3 July 2010 в 19:01
поделиться

1 ответ

Не обрабатывайте HTML-документ как простую строку. Как вы уже заметили, теги / элементы (и то, как они вложены) имеют значение на HTML-странице, и поэтому вы хотите использовать инструмент, который знает, что делать с HTML-документом. Это будет DOM , тогда:

Вот пример. Сначала немного HTML для работы с

$html = <<< HTML
<body>
    <h1>Germany reached the semi finals!!!</h1>
    <h2>Germany reached the semi finals!!!</h2>
    <h3>Germany reached the semi finals!!!</h3>
    <h4>Germany reached the semi finals!!!</h4>
    <h5>Germany reached the semi finals!!!</h5>
    <p>Fans in Germany are totally excited over their team's 4:0 win today</p>
</body>
HTML;

А вот реальный код, который вам может понадобиться, чтобы осчастливить Аргентину

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//*[self::h1 or self::h2 or self::p]');
foreach( $nodes as $node ) {
    $node->nodeValue = str_replace('Germany', 'Argentina', $node->nodeValue);
}
echo $dom->saveHTML();

Просто добавьте теги, которые вы хотите заменить содержимым, в вызове запроса XPath. Альтернативой использованию XPath было бы использование DOMDocument :: getElementsByTagName , которое вы могли бы знать из JavaScript:

 $nodes = $dom->getElementsByTagName('h1');

На самом деле, если вы знаете это из JavaScript, вы можете знать гораздо больше, потому что DOM на самом деле является независимым от языка API, определенным W3C и реализованным на многих языках. Преимущество XPath перед getElementsByTagName , очевидно, состоит в том, что вы можете запрашивать сразу несколько узлов. Недостаток в том, что вы должны знать XPath :)

2
ответ дан 2 September 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: