我有一个html页面加载到PHP变量中,并使用str_replace更改某些单词与其他单词。唯一的问题是,如果其中一个单词出现在一个重要的代码片段中,那么整个事情就会陷入困境。
有没有办法只将str_replace函数应用于某些html标签?特别是:p,h1,h2,h3,h4,h5
编辑:
重要的代码:
$yay = str_ireplace($find, $replace , $html);
欢呼并提前感谢任何答案。
编辑 - 进一步澄清:
$ find和$ replace是包含要分别找到和替换的单词的数组。 $ html是包含所有html代码的字符串。
如果我要找到并替换在例如发生的单词中,那么它就会成为一个很好的例子。域名。所以如果我想用'奶酪'代替'hat'这个词。任何像这样的绝对路径的出现www.worldofhat.com/images/monkey.jpg 将被替换为: www.worldofcheese.com/images/monkey.jpg
因此,如果替换只能在某些标签中出现,则可以避免这种情况。
答案 0 :(得分:2)
不要将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 is actually a language agnostic API defined by the W3C并以多种语言实现。 XPath优于getElementsByTagName
的优势显然是您可以一次查询多个节点。缺点是,你必须知道XPath:)