2

我知道我可能会听到“不要用正则表达式解析 HTML”,所以让我说这个问题在这一点上只是学术性的,因为我实际上使用 DOM 解决了我的问题,但是在解决问题的道路上,我遇到了在gskinner网站上工作的这种模式,但我不知道如何让它在 PHP 中工作preg_match()

(?<=href\=")[^]+?(?=")

我认为这[^]是导致问题的原因,但我不确定该怎么做。

它的目的是从 href 的引号之间拉出子字符串。(人们会期望它是一个网址或至少是其中的一部分。)

4

1 回答 1

4

[^]是一个困难的结构。基本上它是一个空的否定字符类。但它应该匹配什么?这取决于实施。一些语言将其解释为无意义的否定,因此它将匹配每个字符,这就是 gskinner(意味着 ActionScript 3)似乎正在做的事情。

我永远不会使用它,因为它是模棱两可的。

最易读的方法是使用.匹配每个字符的元字符(没有换行符),如果还需要换行符,只需添加s启用 dotall 模式的修饰符,这正是您想要实现的[^]

有时使用的解决方法是使用类似这样的字符类[\s\S][\w\W]. 这些也将匹配每个字符(包括换行符),因为它们匹配一些预定义的字符类及其否定。

于 2013-07-25T06:10:10.867 回答