1

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

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

4

1 回答 1

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 实际上是由 W3C 定义并以多种语言实现的与语言无关的 API。XPath 的优势getElementsByTagName显然是可以一次查询多个节点。缺点是,您必须了解 XPath :)

于 2010-07-03T19:05:08.670 回答