【问题标题】:PHP Regex of Anchor with Class to get Inner Text带有类的锚点的PHP正则表达式以获取内部文本
【发布时间】:2012-01-21 10:11:03
【问题描述】:
<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 regex


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这很好用。似乎正则表达式不是我的问题,而是我从哪里获取我的 html。
【解决方案2】:

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

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

【讨论】:

  • 好点,虽然他的版本当然也适用于他的示例字符串。
  • 当然只是猜测。否则,它似乎符合预期。
【解决方案3】:

这里有两个选项可以修正你的表情:

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

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

这捕获了

<b><i>psychology</i></b>

在第 1 组中。我认为这就是您想要实现的目标。

那么,如果你想捕捉没有粗体和斜体标签的“心理学”,你可以使用:

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

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

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

这就是你要找的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2018-06-15
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多