锚的PHP正则表达式与类来获取内部文本

时间:2011-12-15 18:19:54

标签: php regex

<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'

3 个答案:

答案 0 :(得分:1)

正则表达式看起来不错,尽管你不需要转义引号。也许PHP不喜欢它,如果你使用不必要的转义,虽然我怀疑它。问题更可能是你使用正则表达式的方式。您是否访问了第1组?

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

答案 1 :(得分:1)

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

如果您移除/U,它会按预期工作。使用您给定的输入文本,至少。

答案 2 :(得分:1)

以下是修复表达式的两个选项:

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

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

此捕获

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

。我认为这是你想要实现的目标。

然后,如果你想在没有粗体和斜体标签的情况下捕捉“心理学”,你可以使用:

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

这捕获了第3组中的“心理学”。 在第1组中,您将找到第一个可选标签,无论是“b”,“强”还是什么都没有。 在第2组中,您将找到第二个可选标记,在您的示例中为“i”。

\ s *的多个实例允许标记之间的可选空格。

这是你在找什么?