<a href="/search?hl=en&pwst=1&sa=X&ei=RCPqTqkHycryA_bK_f0J&ved=0CCUQvwUoAQ&q=psychology&spell=1" class=spell><b><i>psychology</i></b></a>
嗨,我正在寻找创建一个与此锚匹配的正则表达式并返回它的内部文本。
这就是我一直在尝试的正则表达式,但没有成功。
'/<a[^>]+class=\"spell\"[^>]*>(.*?)<\/a>/isU'
这可能是非常愚蠢的事情。感谢。
问题是缺少类的引用。不正确的html标记,但我忽略了注意,所以我只是改变了我的正则表达式,将引号作为可选项。
最终正则表达式:
'/<a[^>]+class=\"?spell\"?[^>]*>(.*?)<\/a>/is'
答案 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 *的多个实例允许标记之间的可选空格。
这是你在找什么?