正则表达式匹配某个HTML元素

时间:2010-10-06 15:40:26

标签: php regex html-parsing pcre

我正在尝试编写一个正则表达式来匹配以下HTML。

<span class="hidden_text">Some text here.</span>

我正在努力写出匹配它的条件,并尝试了以下内容,但在某些情况下,它也会在跨度之后选择所有内容。

$condition = "/<span class=\"hidden_text\">(.*)<\/span>/";

如果有人能突出我做错了什么就会很棒。

5 个答案:

答案 0 :(得分:8)

您需要在?之后添加.*来使用非贪婪的选择:

$condition = "/<span class=\"hidden_text\">(.*?)<\/span>/";

注意:如果您需要匹配通用HTML,则应使用DOM之类的XML解析器。

答案 1 :(得分:4)

您不应该尝试在HTML等非常规语言上使用正则表达式。最好使用适当的HTML解析器来解析文档。

有关如何使用PHP执行此操作的详细信息,请参阅以下问题:

答案 2 :(得分:2)

$condition = "/<span class=\"hidden_text\">(?<=^|>)[^><]+?(?=<|$)<\/span>/";

我明白了。 ;)

答案 3 :(得分:0)

您可能有多个跨度,而您正在使用的正则表达式将默认为贪婪模式

使用PHP的DOM Parser从HTML中提取内容

要容易得多

答案 4 :(得分:0)

我认为这就是他们所说的受教育的时刻。 :P现在让我们比较和对比你的自我答案中的正则表达式:

"/<span class=\"hidden_text\">(?<=^|>)[^><]+?(?=<|$)<\/span>/"

......而且这一个:

'~<span class="hidden_text">[^><]++</span>~'
  • PHP的双引号字符串受嵌入变量($my_var)的插值和包围在大括号({return "foo"})中的源代码的评估。如果您不使用这些功能,最好使用单引号字符串以避免意外。作为奖励,你不必再逃避那些双引号。

  • PHP允许您使用几乎任何ASCII标点字符作为正则表达式分隔符。通过用~替换斜杠我消除了在结束标记中转义斜杠的需要。

  • lookbehind - (?<=^|>) - 没有做任何有用的事情。它只会在开始标记匹配后立即进行评估,因此前一个字符总是 >

  • [^><]+?很好(假设你不想在内容中允许其他标签),但量词不需要不情愿。 [^><]+无法覆盖关闭的</span>代码,因此有必要偷偷摸摸。事实上,请继续使用possessive quantifier[^><]++开门。

  • 就像之前的观察一样,(?=<|$)只占用了空间。如果[^><]+消耗了所有内容而下一个字符不是<,那么您就不需要前瞻来告诉您匹配将会失败。

请注意,我只是批评你的正则表达式,而不是修复它;你的正则表达式和我的每次都可能产生相同的结果。即使您正在使用的HTML完全有效,但它们有很多种方法都可能出错。将HTML与正则表达式匹配就像试图捕获一只上油的猪一样。