Мне загрузили страницу 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
Таким образом, если замены могли бы только произойти в определенных тегах, этого можно было бы избежать.
Не обрабатывайте 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 :)