【问题标题】:Replacing words in a block of HTML code without changing the HTML在不更改 HTML 的情况下替换 HTML 代码块中的单词
【发布时间】:2014-10-30 14:18:04
【问题描述】:

假设我有一个 HTML 块,我想在其中对内容进行查找和替换,然后再回显到屏幕上。

我如何确保不更改 HTML 而只是更改内容(在 PHP 中)。

例如,如果我有这个:

<div class='Hello'>Hello</div>

我想用“Hi”替换内容中的所有“Hello”字样,我想得到这个结果:

<div class='Hello'>Hi</div>

目前我正在使用 preg_replace,例如

$new_code = preg_replace(array("/Hello/"), array("Hi"), $code);

但这会给我结果

<div class='Hi'>Hi</div>

【问题讨论】:

  • 为什么不array("/&gt;Hello/"), array("&gt;Hi")
  • 您只想将Hello 替换为Hi
  • 这只是一个例子。内容会比这个长很多,我要替换的词不一定要跟在右括号之后。
  • 我想也许我需要一个与 之间的任何内容都不匹配的正则表达式

标签: php html regex html-parsing


【解决方案1】:

不要使用正则表达式在 HTML 中查找文本,而是使用 DOM 解析器:

您可以使用DomDocument,但要小心它会对部分 HTML 造成奇怪的影响,但这里有一个示例可以帮助您:

$dom = new DOMDocument();
$dom->loadHTML("<html><body><p>Hello</p></body></html>");

$els = $dom->getElementsByTagName('*');

foreach ( $els as $el ) {

    if (preg_replace("/Hello/","Hi",$el->nodeValue))
    {
        $el->nodeValue =preg_replace("/Hello/","Hi",$el->nodeValue);
    }

} 

echo $dom->saveHTML();

Simple HTML DOM 可能会满足您的需求:

来自网站的示例:

$html = str_get_html('<div class='Hello'>Hello</div>');

$html->find('div', 0)->innertext = 'Hi';

echo $html;

【讨论】:

    【解决方案2】:

    如果您期待从 Hello 更改为 Hi 那么,

    $new_code = preg_replace(array("/\>Hello/"), array(">Hi"), $code);
    

    【讨论】:

    • 这只是一个例子。内容会比这个长很多,我想替换的词不一定要跟在右括号之后。
    【解决方案3】:

    尝试使用此断言(参见this question 的答案)仅匹配出现在&gt;&lt; 之间的文本:

    $new_code = preg_replace(array("/(Hello)(?=[^>]*(<|$))/"), array("Hi"), $code);
    

    【讨论】:

    • 这只是一个例子。内容会比这个长很多,我想替换的词不一定要跟在右括号之后。
    • 我编辑了我的答案。是不是更接近你要找的东西?
    • 非常感谢。我试过这个,但问题是如果你有:

      Hello

      那么这匹配两个 Hello,因为它们出现在 p 标签的 >
    【解决方案4】:

    试试这个:

    <?PHP
    
    $html = '<div class="HeLLo" id="HEllO">Hello how to say "hEllo"
             for heLlo world in a helLo world of hellO</div>';
    
    echo preg_replace('/(hello)(?![^>](\s*\w+=".*")*\s*>)/i', "Hi", $html);
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多