我需要一个 pcre 正则表达式来选择所有不带 src 部分的 html img 标签。说来话长。在帮助下,我成功了,直到某一行出现了第二个带有 src 部分的 img 标签。正则表达式将第一个与最后一个(?-s)<img(?!.*?src).*?\/>
匹配:(<img
/>
我怎样才能从中选出坏的部分<img border="0" />
:
<p align="center"><img border="0" /> <a href="http://www.megaevent2014.com/enllac/"><img alt src="http://www.megaevent2014.com/banner/gran/" /></a></p>
在一个正则表达式中。
而且 img 标签可能由于多种原因而无效。删除“border”也无济于事。我需要选择没有 src 的标签,而不必关心其他任何事情。
请提供建议,谨致问候,彼得
答案1
以下正则表达式模式适用于我,并且对于 PCRE Regex 来说应该是格式正确的:
<img(\s*(?!src)([\w\-])+=([\"\'])[^\"\']+\3)*\s*\/?>
- 为了将其分解,首先从文字开始
<img
,然后\s*
匹配任何空格字符[\r\n\t\f ]
零次或无限次。 - 是
(?!src)
负向前瞻,确保字符串src
是不是匹配。 - 第二个捕获组
([\w\-])+
搜索一次到[a-zA-Z0-9_]
无限次之间的任意次,并且是贪婪的(尽可能多地找到它),并且\-
是在标签对中的某处存在连字符的情况下寻找文字<img>
。 - 这
=
是对等号的文字搜索。 - 第三个捕获组,
([\"\'])[^\"\']+\3
尝试匹配单引号或双引号,然后匹配任何内容但单引号或双引号(一次或多次),然后匹配\3
作为第三个捕获组找到的内容(单引号或双引号)。 - 最后,
\s*
匹配任何空格字符[\r\n\t\f ]
零次或无限次,\/?
匹配正斜杠一次,是>
整个事件的结束括号。
正则表达式很有趣。:-)