【问题标题】:Regex for multi-line HTML comments (preg_match_all)多行 HTML 注释的正则表达式 (preg_match_all)
【发布时间】:2011-02-04 19:06:38
【问题描述】:

我有一个带有多个注释掉的 PHP 数组的 html 文档,例如:

<!-- Array
(
[key] => 0
)
-->

使用 PHP,我需要以某种方式仅解析这些 cmets 的 HTML(还有其他需要忽略的 cmets)并提取内容。我一直在尝试使用preg_match_all,但我的正则表达式技能并不高。谁能指出我正确的方向?

非常感谢任何帮助!

【问题讨论】:

    标签: php html regex comments


    【解决方案1】:

    三个事实在这里发挥作用

    1. HTML 文档中没有任何地方可以显示文字“&lt;!--”并且不是表示注释(在其他任何地方都将转义为“&amp;amp;!--”)李>
    2. 您似乎不想更改文档内容,只查找其中的位(搜索和替换很有可能破坏文档,单独搜索没有)李>
    3. cmets 不能嵌套在 HTML 中(与普通的 HTML 标签相反)——这一切都不同

    上述组合意味着(你瞧)正则表达式可以用于识别 HTML cmets。

    试试这个正则表达式:&lt;!-- Array([\s\S])*?--&gt;。匹配组 1 将包含 "Array" 之后的所有内容,直到评论的结束序列。

    您可以对找到的位进行进一步的完整性检查,以确保它们确实是您正在寻找的。​​p>

    【讨论】:

    • 2.不正确:&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt; &lt;title&gt;Comments where you don't expect&lt;/title&gt; &lt;h1&gt;Comments where you don't expect&lt;/h1&gt; &lt;!-- This is a comment --&gt; &lt;div&gt; &lt;img src="http://sstatic.net/so/img/logo.png" alt="&lt;!-- this is just alt text"&gt; &lt;/div&gt;
    • 为了清楚起见,我正在处理的文档是 XHTML 1.0 Strict
    • @David:是的,这是边缘情况(+1 评论)。我的评论是,在文档中使用非转义尖括号 anywhere 是不好的、不好的风格,除了标签(属性值是唯一可以使用 &lt; 的地方……呃……容忍)。但我承认它可能发生在某个地方,当然您需要知道它是否会发生在您的数据中。
    • 谢谢 - 这就是诀窍。很抱歉很厚,但是有没有办法删除 HTML 注释标签并只包含内容?
    • @David: a) HTML 并不是要尽可能避免尴尬的字符序列,因为它们会妨碍阅读。人类消费不是 HTML 的主要功能,正确地将标记数据传输到用户代理才是。 b) 我不确定。你可以,因为 HTML 解析器是宽大的和宽容的。 c) 告诉我规范中允许的部分。 ;) 底线是 - “这是可能的”!= “你可以”。示例:可以在 PHP 中做到这一点:preg_replace("/\d/", "", $s),但仍然是错误,因为它必须是 preg_replace("/\\d/", "", $s);`。正确的转义是关键。
    【解决方案2】:

    【讨论】:

    • 是的。我永远不会说。在某些情况下它更容易并且工作得很好。这就像那些说“永远不要使用 goto”的人,然后想出最复杂的方法来打破嵌套循环。
    • 我可以看到一般用途的基本原理,但在这种情况下,我知道我正在搜索的确切字符串...
    【解决方案3】:

    如何使用允许您访问 cmets 的 HTML 解析器(例如 Simple HTML DOM),然后使用 strpos 检查每个注释是否有新行。

    $html = str_get_html('...HTML HERE...');
    $comments = $html->find('comment');
    foreach ( $comments as $comment ){
        if ( strpos($comment, "\n") !== false ){
            //process comment
        }
    }
    

    【讨论】:

    • 谢谢 - 我想知道是否有办法通过 domDocument 做类似的事情?
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2016-07-20
    • 2019-12-25
    • 2013-04-20
    • 2010-11-08
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多