【问题标题】:Using regex to remove unessential comments from source使用正则表达式从源代码中删除不必要的注释
【发布时间】:2020-09-20 03:10:41
【问题描述】:

这是我想出的从源代码中删除 cmets 的表达式,它会删除除浏览器特定 cmets 之外的所有 cmets。

/<\!--(?!\[if).*?-->/s

我不是 100% 理解正则表达式,但我设法通过在 Stack 中搜索时发现的各种表达方式将其组合在一起“弗兰肯斯坦”。这就是我看到这个表达式崩溃的方式,如果有人能帮助我进一步理解它,我会很高兴。

/<\!--

用于搜索我想用斜杠替换的部分以转义!因为它是表达式的一部分?

(?!\[if)

表示if不包含[if block?

 .*?

通配符这么说,不管中间是什么?

-->

我希望表达式找到的位的结尾。

/s

告诉表达式运行,即使表达式之间有空格?

我不想只使用代码,因为它可以满足我的需要,我想真正了解我在使用什么,并学习如何在未来更好地使用它。

这个表达式很好用,但我确实需要帮助才能更进一步。在我的源代码中,我在脚本标签 I.E. 中有代码 sn-ps

<script type="text/javascript">
  <!--
    // Main vBulletin Javascript Initialization
    vBulletin_init();
  //-->
</script>

有没有办法可以调整我当前的表达式以使用 javascript 排除 &lt;!-- cmets?

我正在努力实现的一个例子可以看到HERE

【问题讨论】:

    标签: php regex comments preg-replace


    【解决方案1】:

    您已经意识到正则表达式模式不适合处理编程语言。在这里,要使用的工具显然是 HTML 解析器。使用 DOM 和 XPath 的示例:

    $dom = new DOMDocument;
    $dom->loadHTML($html);
    $xp = new DOMXPath($dom);
    
    $comments = $xp->query('//*[not(local-name()="script")]/comment()[not(contains(.,"[if"))]');
    
    foreach($comments as $comment) {
        $comment->parentNode->removeChild($comment);
    }
    
    echo $dom->saveHTML();
    

    【讨论】:

    • 大声笑,我会试一试。我从未使用过 DOM。此外,如果 dom 是解决方案,什么时候可以接受使用正则表达式而不是 dom?
    • @DrCustUmz 任何涉及具有不可预测内容的标签的东西通常都不是您想要使用正则表达式的东西。模式变得过于复杂和不可靠。
    • 谢谢 emsimpson,我会尝试实施这个 dom 示例并报告回来。谢谢你们。
    • 我已经成功地实现了这个方法我发现使用这个方法的唯一奇怪之处是它在脚本标签中将'(撇号)变成了&amp;acirc;&amp;#128;&amp;#153;。 ' 我在其中添加了一个变量以显示一个人的所有权并且不是真正需要的,所以这不是问题。尽管我发现它这样做很奇怪。我不会我的页面是 UTF-8 编码的。
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 2015-02-16
    • 2011-05-23
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多