求一个匹配 html 注释的正则

2015-04-02 19:43:22 +08:00
 lianyue

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

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

我的建议是,永远不要用正则处理这一类的问题。各种 Corner cases 能搞死你,最后发现还是得自己写一个状态机。然后重新发明了 parser ……
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
2015-04-03 09:41:34 +08:00
@river1007 不行 我的意思是 除了 <textarea> 和 <script> 标签内的注释 其他注释都匹配你的代码稍微内容改变下就不行了 <span>xxx<!--要匹配--></span>
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
2015-04-03 11:21:02 +08:00
@TimLang 这个很对,正则本身就不是做这种事的工具。
哪怕是匹配个邮件地址也都是很困难:
http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

选对的工具很多时候能节省很多生命。
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
2015-04-03 11:31:58 +08:00
@xcv58 噗 坑
lianyue
2015-04-03 11:32:22 +08:00
@river1007 算了 想不到什么好的方案 就那样了无视掉注释

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181194

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX