<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'
这个正则表达式看起来没有问题,尽管您不需要转义引号。也许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*的多个实例允许标签之间有可选的空格。
这是你要找的吗?