使用Regex解析HTML

时间:2014-06-09 11:19:47

标签: c# html xml regex xslt

希望有人能帮忙解决这个问题......

我在XSLT中使用正则表达式来解析HTML文档,我正在寻找一个正则表达式,它将返回不在有效p标签中的文本。

e.g。

I want to find this text
<p>I don't want to find this text</p>
I want to find this text

1 个答案:

答案 0 :(得分:0)

使用正则表达式解析html是一项有风险的业务,在您的情况下更是如此,因为嵌套标记的可能性。你可能不想这样做。

话虽如此,对于所有免责声明,鉴于您提供的简单样本,您可以检查这个骨架解决方案,看看什么会对正则表达式有所作用。我希望其他人能给你一个Dom解析器解决方案。

此骨架解决方案使用此正则表达式:

(?i)<(\w+).*?<\/\1[^>]*>|([a-z][a-z ]+)

请注意,这是解决方案的框架,因为与[a-z][a-z ]+匹配的I want this必须进行细化,以包含您希望允许的字符,例如数字,破折号等等。它不能是一个普通的点星,否则会占用被|左边的正则表达式片段固定的字符串部分。

它是如何运作的?

在这种情况下,您希望排除某些内容不匹配 - 在这种情况下是标记。它类似于regex-matching a pattern unless...

这个问题

交替|的左侧与完整的<something > tags</something >标记相匹配。我们将忽略这些匹配。右侧匹配并捕获内容&#34;到第2组,我们知道(或希望)它是正确的东西,因为它与左边的表达不匹配。

此程序显示了如何使用正则表达式(请参阅online demo底部的结果):

using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program
{
static void Main()  {
string s1 = @"want to find this text
<p>I don't want to find this text</p>
I want to find this text";
var myRegex = new Regex(@"(?i)<(\w+).*?<\/\1[^>]*>|([a-z][a-z ]+)");
var group1Caps = new StringCollection();

Match matchResult = myRegex.Match(s1);
// put Group 2 captures in a list
while (matchResult.Success) {
   if (matchResult.Groups[2].Value != "") {
        group1Caps.Add(matchResult.Groups[2].Value);
        }
  matchResult = matchResult.NextMatch();
}

Console.WriteLine("\n" + "*** Matches ***");
if (group1Caps.Count > 0) {
   foreach (string match in group1Caps) Console.WriteLine(match);
   }

Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();

} // END Main
} // END Program

参考

How to match (or replace) a pattern except in situations s1, s2, s3...