0

我正在尝试匹配来自 HTML 源的特定跨度标签。

标记的语言属性和内部 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

由于正则表达式往往是贪婪的,这个表达式匹配完整的主题,而不仅仅是一个跨度标签及其内容。

我如何设法只匹配一个跨度标签?

4

3 回答 3

5

我们再也不会重复了:不要使用正则表达式来处理 HTML!


相反,使用DOMDocument::loadHTML.

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

真的:花时间学习 DOM:这是一笔巨大的投资!

于 2011-03-11T12:00:39.247 回答
1

只是添加, 我认为

/(<span lang="(.*?)">(.*?)</span>)/is
于 2011-03-11T12:04:53.623 回答
1

您可以使用以下方法将其指定为不贪婪?

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

或默认使用PCRE_UNGREEDY 修饰符使所有表达式不贪婪

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

于 2011-03-11T12:02:01.770 回答