正则表达式匹配除<p>和</p>之外的所有HTML标记和标记内容

时间:2009-03-20 20:19:46

标签: regex coldfusion

我正在寻找匹配所有HTML标记的正则表达式,但<p></p>除外,其中包含标记内容。我正在开发ColdFusion。

除了<p></p>之外,还有earlier post个匹配标记,但我还需要抓取标记之间的所有内容。例如,以下内容应完全匹配:

<a href="http://www.google.com">Google</a>

<em>Some text here</em>

但不是

<p>Some text and tags here</p>

关于如何实现这一目标的任何想法?

4 个答案:

答案 0 :(得分:6)

使用正则表达式解析HTML非常困难和痛苦。

最好使用某种基于DOM的解析器并找到所需的元素。

答案 1 :(得分:1)

有时将正则表达式与一些额外的检查结合起来会更容易。

所以\<.*?\>.*?\<\/.*?\>应匹配<..>...</..>之类的标签之间的任何内容。然后,您可以通过编程方式检查<..></...>分别不是<p></p>。如果你将它们分组ala,那么检查这个可能是最简单的:

(\<.*?\>).*?(\<\/.*?\>)

然后检查以确保$1$2(或者您在环境中进行反向引用)不是段落打开和关闭标记。

.*?指定最小匹配;我假设你的正则表达式环境支持它。

答案 2 :(得分:0)

你还没有说过你要做什么,但是使用XmlParse函数创建一个XML DOM,然后对此进行处理,你会有一个很好的改变。

答案 3 :(得分:0)

这有用吗?我只做了一些检查,但似乎:

Regex expr = new Regex(@"<([A-OQ-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>", RegexOptions.IgnoreCase);

我刚复制过&amp;粘贴了C#代码。要获取标记之间的所有内容,您需要使用\ 1,然后您需要关闭区分大小写,因此IgnoreCase或-i或您正在使用的任何工具都提供该选项。如果你的工具不这样做,那么你将不得不做A-Oa-oq-zQ-z等。只是正则表达式:

<([A-OQ-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>

请注意,这会记录匹配独立标记,但应该让您入门。