【问题标题】:PHP preg_replace html tag containing line breaksPHP preg_replace 包含换行符的 html 标记
【发布时间】:2016-04-02 16:46:33
【问题描述】:

我正在尝试使用 preg_replace 删除某个 html 标记,但我找不到任何方法,如果我删除换行符但不删除,它就可以工作。

到目前为止的正则表达式:

preg_replace("/<ol class=\"comment-list\">.*?<\/ol>/", "", $string);

有问题的字符串:

<ol class="comment-list">
<time datetime="2016-03-25T15:27:34+00:00"></ol>

我正在使用http://www.phpliveregex.com/ 进行测试。

非常感谢您的帮助!

【问题讨论】:

  • 添加 s 修饰符,使点 . 也匹配换行符:...&lt;\/lol&gt;/s
  • 你想要什么输出?
  • @HamZa 的评论实际上是此页面上唯一有用的信息。是的,建议您不要使用正则表达式解析 (x)HTML。但是这里的问题非常简单,只是询问如何将换行符与 preg_replace 匹配。

标签: php regex preg-replace


【解决方案1】:

我知道这个答案可能不是您想要的,但如果您想尝试,这就是您可以使用 DOMDocument 删除 &lt;ol&gt; 节点的方法:

$dom = new DOMDocument();           // Init DOMDocument object
libxml_use_internal_errors( True ); // Disable libxml errors
$dom->loadHTML( $html );            // Load HTML
$xpath = new DOMXPath( $dom );      // Init DOMXPath (useful for complex queries)

/* Search for all <ol> nodes with class “comment-list”: */
$nodes = $xpath->query( '//ol[@class="comment-list"]' );
/* Remove nodes: */
while( $nodes->length )
{
    $nodes->item(0)->parentNode->removeChild( $nodes->item(0) );
}

/* Output modified HTML: */
echo $dom->saveHTML();

是的,这是 7 行对 1 行,但我建议你这样。正则表达式是一项伟大的发明,但不适用于 HTML/XML。


【讨论】:

    【解决方案2】:

    正如我在本页的小 cmets 中所说,@HamZa 的评论实际上是这里唯一有用的信息:将 s 修饰符添加到您的正则表达式中,以便它匹配换行符。

    preg_replace("/<ol class=\"comment-list\">.*?<\/ol>/s", "", $string);
    

    建议不要使用正则表达式解析 (x)HTML。但是这里的问题非常简单,只是询问如何将换行符与 preg_replace 匹配。这就是你的做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2014-03-08
      • 2011-11-13
      • 2023-03-06
      • 2012-09-05
      相关资源
      最近更新 更多