У меня есть html-страница, загружаемая в переменную PHP, и я использую str_replace для изменения определенных слов другими словами. Единственная проблема заключается в том, что если одно из этих слов появляется в важной части кода, то вся вещь падает до бит.
Есть ли способ применить функцию str_replace только к определенным тэгам html? В частности: p, h1, h2, h3, h4, 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 🙂