3

好的,我完全了解为什么这个正则表达式有效。我正在使用的文本是这样的:

<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" />

因此,基于此,我认为简单地删除 no backreference 将返回相同的结果:

/<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" />

所以有人愿意通知我,或者至少给我指出这里发生的事情的正确方向吗?

4

1 回答 1

2
/<img(?:(?!alt=).)*?>/

此正则表达式对其匹配的每个字符应用img前瞻。因此,一旦找到alt=,它就会停止。所以,它只会匹配img没有alt属性的标签。

/<img(?!alt=).*?>/

此正则表达式仅在img. 因此,它会匹配所有标签,直到第一个标签后面没有跟随的>所有标签,无论是否出现在字符串后面的任何位置。将涵盖在imgalt=alt=.*?

/<img(?!alt=).*>/

这与前一个相同,但它匹配直到最后一个的所有内容>,因为它使用greedy matching. 但我不知道你为什么得到那个输出。你应该得到一切,直到最后>一次</html>


现在忘记那里发生的一切,并转向HTML Parser, 来解析HTML. 它们专为此任务而设计。所以,不要费心使用正则表达式,因为你不能通过正则表达式解析每一种 HTML。

于 2013-02-14T21:56:09.947 回答