繁体   English   中英

正则表达式删除条件注释

[英]Regex to remove conditional comments

我想要一个可以匹配HTML源页面中的条件注释的正则表达式,所以我只能删除那些。 我想保留常规评论。

我也想避免使用。*? 符号如果可能的话。

文字是

foo

<!--[if IE]>

<style type="text/css">

ul.menu ul li{
    font-size: 10px;
    font-weight:normal;
    padding-top:0px;
}

</style>

<![endif]-->

bar

我想删除<!--[if IE]><![endif]-->

编辑:这是因为BeautifulSoup我想删除这些标签。 BeautifulSoup无法解析并提供不完整的来源

EDIT2: [如果IE]不是唯一的条件。 还有更多,我没有任何可能的组合列表。

EDIT3: Vinko Vrsalovic的解决方案有效,但是为什么beautifulsoup失败的实际问题是由于条件评论中的流氓评论。 喜欢

<!--[if lt IE 7.]>
<script defer type="text/javascript" src="pngfix_253168.js"></script><!--png fix for IE-->
<![endif]-->

请注意<!--png fix for IE--><!--png fix for IE-->评论?

虽然我的问题已经解决了,但我希望得到一个正则表达式的解决方案。

>>> from BeautifulSoup import BeautifulSoup, Comment
>>> html = '<html><!--[if IE]> bloo blee<![endif]--></html>'
>>> soup = BeautifulSoup(html)
>>> comments = soup.findAll(text=lambda text:isinstance(text, Comment) 
               and text.find('if') != -1) #This is one line, of course
>>> [comment.extract() for comment in comments]
[u'[if IE]> bloo blee<![endif]']
>>> print soup.prettify()
<html>
</html>
>>>     

python 3与bf4:

from bs4 import BeautifulSoup, Comment
html = '<html><!--[if IE]> bloo blee<![endif]--></html>'
soup = BeautifulSoup(html, "html.parser")
comments = soup.findAll(text=lambda text:isinstance(text, Comment) 
               and text.find('if') != -1) #This is one line, of course
[comment.extract() for comment in comments]
[u'[if IE]> bloo blee<![endif]']
print (soup.prettify())

如果您的数据与BeautifulSoup混淆,您可以事先修复它或自定义解析器,以及其他解决方案。

编辑:根据您的评论,您只需根据需要修改传递给findAll的lambda(我修改了它)

这是你需要的:

<!(|--)\[[^\]]+\]>.+?<!\[endif\](|--)>

它将过滤掉各种条件评论,包括:

<!--[if anything]>
    ...
<[endif]-->

<![if ! IE 6]>
    ...
<![endif]>

EDIT3 :Vinko Vrsalovic的解决方案有效,但是为什么beautifulsoup失败的实际问题是由于条件评论中的流氓评论。 喜欢

请注意评论?

虽然我的问题已经解决了,但我希望得到一个正则表达式的解决方案。

这个怎么样:

(<!(|--)\[[^\]]+\]>.*?)(<!--.+?-->)(.*?<!\[endif\](|--)>)

替换正则表达式,将\\ 1 \\ 4(或$ 1 $ 4)作为替换。
我知道它有。*? 和。+? 在其中,请看我对这篇文章的评论。

在我看来,你只需要担心下层隐藏的注释(以<!--开头的注释),你不需要匹配单词if和它后面的空格。 这应该做你想要的:

"<!--\[if\s(?:[^<]+|<(?!!\[endif\]-->))*<!\[endif\]-->"

中间的混乱是为了满足你不使用的愿望.*? ,但我认为这不值得努力。 .*? 如果您使用Re.S标志集编译正则表达式或将其包装在(?s:...)方法应该可以正常工作。 例如:

"(?s:<!--\[if\s.*?<!\[endif\]-->)"

@Benoit

小修正(多线打开):

 "<!--\[if IE\]>.*?<!\[endif\]-->"

我只想跟:

import re

html = """fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs---><!--[if lt IE 7.]>\
<script defer type="text/javascript" src="pngfix_253168.js"></script><!--png fix for IE-->\
<![endif]-->fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->"""

# here the black magic occurs (whithout '.')
clean_html = ''.join(re.split(r'<!--\[[^¤]+?endif]-->', html))

print clean_html

'fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->'

注意:[^¤]将匹配任何不是'¤'的字符。 这非常有用,因为它快速闪电,这个字符可以在任何键盘上找到。 但诀窍是它很难输入(没有人会错误地输入它)并且没有人使用它:它是一个通用的货币设计字符。

但是,如果您不想使用¤,则可以使用chr(7)生成“系统铃”字符,这是不可打印的,无法在网页中找到;-)

不要使用正则表达式。 您会对包含开始标记的评论感到困惑,哪些不是,并做错了。 HTML不常规,尝试使用单个正则表达式修改它将失败。

为此使用HTML解析器。 BeautifulSoup是一个优秀,简单,灵活和坚固的,能够处理真实世界(意味着无可救药地破坏)的HTML。 有了它,你可以查找所有注释节点,检查其内容(你可以使用正则表达式 ,如果你愿意的话),如果他们需要被删除删除它们。

这适用于Visual Studio 2005,其中没有行间距选项:

\\<!--\\[if IE\\]\\>{.|\\n}*\\<!\\[endif\\]--\\>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM