str_replace仅限于某些html标记内

时间:2010-07-03 18:47:45

标签: php str-replace

我有一个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

因此,如果替换只能在某些标签中出现,则可以避免这种情况。

1 个答案:

答案 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:)