PHP正则表达式的锚与类,以获得内部文本


PHP Regex of Anchor with Class to get Inner Text

<a href="/search?hl=en&amp;pwst=1&amp;sa=X&amp;ei=RCPqTqkHycryA_bK_f0J&amp;ved=0CCUQvwUoAQ&amp;q=psychology&amp;spell=1" class=spell><b><i>psychology</i></b></a>

嗨,我想创建一个匹配这个锚并返回它的内部文本的正则表达式。

这是我一直在尝试作为一个正则表达式,但没有成功。

'/<a[^>]+class='"spell'"[^>]*>(.*?)<'/a>/isU'

这可能是一些非常愚蠢的事情。谢谢。


问题是缺少类周围的引号。不是适当的html标记,但我忽略了注意,所以我只是改变我的正则表达式有引号作为可选的。

最后正则表达式:

'/<a[^>]+class='"?spell'"?[^>]*>(.*?)<'/a>/is'

这个正则表达式看起来没有问题,尽管您不需要转义引号。也许PHP不喜欢使用不必要的转义,尽管我对此表示怀疑。问题更可能出在您使用正则表达式的方式上。你访问了第1组吗?

if (preg_match('%<a[^>]+class="spell"[^>]*>(.*?)</a>%', $subject, $regs)) {
    $result = $regs[1];
}

您的问题可能是(.*?)/isU修饰符的组合。U改变了?的意义,使你的匹配组(.*)实际上是贪婪的。然后,您将匹配<'/a>结束标记之外的部分,直到它遇到另一个。

如果您删除/U,它将按预期工作。对于给定的输入文本,至少。

这里有两个选项来修复你的表达式:

对于初学者,您可以将表达式简化为:

class='"spell'"[^>]*>(.*?)<'/a>

捕获

<b><i>psychology</i></b>
第1组

。我猜这就是你想要达到的目标。

然后,如果你想在没有粗体和斜体标签的情况下捕获"psychology",你可以使用:

class='"spell'"[^>]*>'s*<('w+)>?'s*<('w+)>?'s*(.*?)<'/'2>'s*<'/'1>'s*<'/a>

这抓住了第3组的"心理"。在第1组中,您将找到第一个可选标记,无论它是"b"、"strong"还是什么都不是。在第2组中,您将发现第二个可选标记,在您的示例中是"i"。

's*的多个实例允许标签之间有可选的空格。

这是你要找的吗?