我需要一个正则表达式来执行以下操作(不幸的是它必须是一个正则表达式,我不能编码,因为它在购买的产品中工作):
我想在html块中选择所有图像标记,其中图像标记不包含类属性,或者,如果它包含类属性,则该属性在开头不包含特定字符串。基本上,我想从一大块html中删除(通过匹配)所有图像标记,除了应用了特定类的图像。
这可能是两个单独的正则表达式 - 我只想匹配它们 - 不提取任何数据。
所以,例如,假设我要保留的课程名为Pretty。
我希望正则表达式匹配:
<img src="xx"/>
<img border="x" src="xx"/>
<img whatever other attributes src="xx"/>
<img class="ugly" src="xx"/>
<img whatever other attributes class="fugly" src="xx"/>
但不匹配
<img class="Pretty" src="xx"/>
<img whatever other attributes class="Pretty" src="xx"/>
<img class="Pretty subpretty" src="xx"/>
如果在一个正则表达式中更容易(一个匹配所有没有类属性的图像标记,一个匹配那些不具有'漂亮'的类属性的图像标记),那也完全没问题。
答案 0 :(得分:8)
改为使用XPath,因为它的用途是:
//img[not(contains(@class,'Pretty'))]
此XPath表达式查找img
属性不包含字符串class
的每个'Pretty'
元素。我认为它适用于缺少class
属性的元素。
使用正则表达式解析XML和HTML通常是一个非常糟糕的主意。当然,只有当问题严格的HTML时,XPath才有效。如果它不是一个有效的XML文档,那么你可能希望默认返回其他东西,但即便如此,正则表达式也不适合这项工作。
附录:我在30分钟内回到这里是错误的。出现了一些问题,我没有时间对其进行整理。如果它对缺少class
属性的元素不起作用,请使用以下表达式:
//img[(not(@class)) or (not(contains(@class,'Pretty')))]
答案 1 :(得分:2)
有点快而又脏,但它有效:
/(?!<img\b[^>]+\bclass="?[^>"]*\bPretty\b)<img\b[^>]*>/
工作原理:
<img\b[^>]+\bclass="?[^>"]*\bPretty\b
匹配所有“漂亮”的图像。
<img\b[^>]*>
匹配所有图片。因此,将“漂亮”图像子模式放在子模式前面的负前瞻中,以匹配所有图像。然后,这将匹配所有图像,减去与漂亮子图案匹配的图像。
答案 2 :(得分:1)
<img(?:\s+(?:(?!class\b)\w+="[^"]*"|class="(?!Pretty)[^"]*"))*/>
这似乎回答了你的问题,但有许多细节你没有解决,例如:
标记和属性名称是否始终小写?
如果班级名称以“漂亮”开头(即区分大小写),该怎么办?
是否始终引用属性值,并始终使用双引号?
是否会有额外的空格,比如“=”或最后的“/&gt;”?
您的“购买工具”是否支持带负面预测的正则表达式?
答案 3 :(得分:0)
是的,对于所有那些建议我最好使用正则表达式以外的东西的人当然是对的,但我猜你错过了问题中的第一句话。
我最终找到了解决方案,尼克和阿兰M看起来最接近那个,谢谢你们!幸运的是,我可以使用负向前瞻,所以它完美地工作:)