好的,我已经完全了解为什么这个正则表达式有效了。我正在处理的文本是这样的:
<html>
<body>
hello
<img src="withalt" alt="hi"/>asdf
<img src="noalt" />fdsa<a href="asdf">asdf</a>
<img src="withalt2" alt="blah" />
</body>
</html>
使用以下正则表达式(在 php 中测试,但我假设它对所有 perl 正则表达式都是正确的),它将返回所有不包含 alt 标签的 img 标签:
/<img(?:(?!alt=).)*?>/
Returns:
<img src="noalt" />
因此基于此,我认为简单地删除无反向引用会返回相同的结果:
/<img(?!alt=).*?>/
Returns:
<img src="withalt" alt="hi"/>
<img src="noalt" />
<img src="withalt2" alt="blah" />
如您所见,它只返回所有图像标签。然后让事情变得更加困惑,删除? (据我所知,这只是一个通配符)在 * 返回到最后的 >
之后/<img(?!alt=).*>/
Returns:
<img src="withalt" alt="hi"/>
<img src="noalt" />fdsa<a href="asdf">asdf</a>
<img src="withalt2" alt="blah" />
所以有人愿意通知我,或者至少为我指出这里发生的事情的正确方向吗?
最佳答案
/<img(?:(?!alt=).)*?>/
此正则表达式对它在 img
之后匹配的每个字符应用否定先行 .所以,一旦它找到 alt=
,它停止了。所以,它只会匹配 img
标签,没有 alt
属性。
/<img(?!alt=).*?>/
这个正则表达式,只是在 img
之后应用了否定前瞻 .所以,它将匹配所有内容,直到第一个 >
。对于所有 img
后面没有 alt=
的标签,无论是否alt=
出现在字符串下方的任何位置。它将在 .*?
中介绍
/<img(?!alt=).*>/
这与上一个相同,但它匹配直到最后一个的所有内容 >
, 因为它使用 greedy matching
.但我不知道你为什么得到那个输出。你应该得到一切直到最后>
对于 </html>
.
现在忘掉那里发生的一切,朝着 HTML Parser
前进, 用于解析 HTML
.它们专门为此任务而设计。所以,不要费心使用正则表达式,因为您无法通过正则表达式解析所有类型的 HTML。
关于regex - 为什么这个正则表达式有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14884588/