正则表达式 - 贪婪 - 匹配HTML标签,内容和属性

时间:2011-03-11 11:56:50

标签: php html regex greedy regex-greedy

我正在尝试匹配HTML源代码中的特定span-tag。

lang-attribute和标签的内部HTML用作返回新字符串的函数的参数。

我想用被调用函数的结果替换旧标签,属性和内容。

主题将是这样的:

<p>Some codesnippet:</p>
<span lang="fsharp">// PE001
let p001 = [0..999]
           |> List.filter (fun n -> n % 3 = 0 || n % 5 = 0)
           |> List.sum
</span>
<p>Another code snippet:</p>
<span lang="C#">//C# testclass
class MyClass {
}
</span>

为了提取lang属性和内容的值,我使用以下表达式对这些值进行分组:

/(<span lang="(.*)">(.*)</span>)/is

由于正则表达式趋于贪婪,因此该表达式与完整主题匹配,而不仅仅是一个span-tag及其内容。

如何设置只匹配一个span-tag?

3 个答案:

答案 0 :(得分:5)

我们永远不会再次重新评估:不要使用正则表达式来处理HTML!


相反,请使用DOMDocument::loadHTML

它允许您使用DOM操纵HTML数据,这更强大,更容易:您将能够:

真的:花点时间学习DOM:这是一项很好的投资!

答案 1 :(得分:1)

您可以使用?

将其指定为不合格

/(<span lang="(.*?)">(.*?)<\/span>)/is

或默认情况下使用PCRE_UNGREEDY modifier

使所有表达无效

/(<span lang="(.*)">(.*)<\/span>)/Uis

答案 2 :(得分:1)

只需添加,我认为

/(<span lang="(.*?)">(.*?)</span>)/is