V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lianyue
V2EX  ›  正则表达式

求一个匹配 html 注释的正则

  •  
  •   lianyue · 2015-04-02 19:43:22 +08:00 · 2520 次点击
    这是一个创建于 3530 天前的主题,其中的信息可能已经有所发展或是发生改变。

    <script><!--不匹配--></script>
    <!--要匹配-->
    <span><!--要匹配--></span>
    <textarea><!--不匹配--></textarea>
    <script><xxx><!--不匹配--></xxx></textarea>
    需要匹配在指定前套标签意外的 html 注释

    15 条回复    2015-04-03 11:32:22 +08:00
    yjmade
        1
    yjmade  
       2015-04-02 21:39:03 +08:00
    不要用正则来处理html或xml
    lianyue
        2
    lianyue  
    OP
       2015-04-02 21:59:31 +08:00
    @yjmade 那用什么处理
    frankzeng
        3
    frankzeng  
       2015-04-02 22:56:59 +08:00
    python beautifulsoup或是xpath,怎么那么多人喜欢用正则表达式来解释html,这东西不好写啊
    lianyue
        4
    lianyue  
    OP
       2015-04-02 22:59:19 +08:00
    @frankzeng php... 除了过滤注释其他都好了
    FrankFang128
        5
    FrankFang128  
       2015-04-02 23:08:33 +08:00 via Android
    永远不要用regex匹配HTML
    hotcha0111
        6
    hotcha0111  
       2015-04-02 23:18:47 +08:00
    ETiV
        7
    ETiV  
       2015-04-03 00:00:29 +08:00 via iPhone
    问题是,解析库支持收集注释吗……
    xcv58
        8
    xcv58  
       2015-04-03 05:50:59 +08:00
    @FrankFang128 +1

    我的建议是,永远不要用正则处理这一类的问题。各种 Corner cases 能搞死你,最后发现还是得自己写一个状态机。然后重新发明了 parser ……
    river1007
        9
    river1007  
       2015-04-03 09:27:18 +08:00
    来个PHP测试版本试试:
    <?php
    $x = <<<ABC
    <script><!--不匹配--></script>
    <!--要a匹配-->
    <span><!--要b匹配--></span>
    <textarea><!--不匹配--></textarea>
    <script><xxx><!--不匹配--></xxx></textarea>
    ABC;
    preg_match_all('#^(?:<span><!--|<!--)([^>]+)(?:--></span>|-->)$#um', $x, $M, PREG_PATTERN_ORDER);
    var_dump($M);
    lianyue
        10
    lianyue  
    OP
       2015-04-03 09:41:34 +08:00
    @river1007 不行 我的意思是 除了 <textarea> 和 <script> 标签内的注释 其他注释都匹配你的代码稍微内容改变下就不行了 <span>xxx<!--要匹配--></span>
    TimLang
        11
    TimLang  
       2015-04-03 10:10:23 +08:00
    @xcv58 stackoverflow上有个很有名回复的很清楚,
    http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
    You can't parse [X]HTML with regex. Because HTML can't be parsed by regex.

    不过现在的正则引擎支持引用自身,理论上只能解析html的。
    xcv58
        12
    xcv58  
       2015-04-03 11:21:02 +08:00
    @TimLang 这个很对,正则本身就不是做这种事的工具。
    哪怕是匹配个邮件地址也都是很困难:
    http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

    选对的工具很多时候能节省很多生命。
    river1007
        13
    river1007  
       2015-04-03 11:28:46 +08:00
    @lianyue
    根据自己的需求改吧,和你本省的html标签也有关系,正则麻烦就用程序处理。
    $x = <<<ABC
    <script><!--不匹配--></script>
    lsdf<!--要匹配a-->sdf
    <span>sdhh<!--要匹配b-->sdf</span>
    <textarea><!--不匹配--></textarea>
    <textarea><xxx><!--不匹配--></xxx></textarea>
    ABC;
    preg_match_all('#^(?!<script>|<textarea>).*?(?:<!--([^>]+)-->).*?(?!</textarea>|</script>)$#um', $x, $M, PREG_PATTERN_ORDER);
    var_dump($M);
    lianyue
        14
    lianyue  
    OP
       2015-04-03 11:31:58 +08:00
    @xcv58 噗 坑
    lianyue
        15
    lianyue  
    OP
       2015-04-03 11:32:22 +08:00
    @river1007 算了 想不到什么好的方案 就那样了无视掉注释
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1991 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.