【问题标题】:str_replace within certain html tags onlystr_replace 仅在某些 html 标记内
【发布时间】:2010-07-03 18:47:45
【问题描述】:

我有一个加载到 PHP 变量中的 html 页面,并且正在使用 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

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

【问题讨论】:

  • 你的$find$replace是什么,即你想用什么替换什么?
  • 你能举个例子说明它什么时候“崩溃”吗?
  • 当然,如果简短,我很抱歉。 $find 和 $replace 是包含要查找和替换的单词的数组(分别)。一个很好的例子就是如果我要查找并替换出现在例如域名。所以如果我想用“奶酪”代替“帽子”这个词。任何出现像 www.worldofhat.com/images/monkey.jpg 这样的绝对路径都将被替换为: www.worldofcheese.com/images/monkey.jpg 因此,如果替换只能出现在某些标签中,则可以避免这种情况。将其添加到主要描述中。
  • 好的,现在清楚多了。还有一个更简单的问题:“在某些标签中”是指标签的属性还是开始和结束标签之间的文本?
  • @casablanca,只是标签之间的文字

标签: php str-replace


【解决方案1】:

不要将 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 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2013-02-19
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多