我正在尝试编写一个正则表达式来匹配以下HTML。
<span class="hidden_text">Some text here.</span>
我正在努力写出匹配它的条件,并尝试了以下内容,但在某些情况下,它也会在跨度之后选择所有内容。
$condition = "/<span class=\"hidden_text\">(.*)<\/span>/";
如果有人能突出我做错了什么就会很棒。
答案 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与正则表达式匹配就像试图捕获一只上油的猪一样。