2013-07-30 84 views
1

我具有以下正则表达式:正则表达式表达C#为HTML

^(<span style=.*?font-weight:bold.*?>.*?</span>) 

它下面的代码匹配:

<span style="font-family:Arial; font-size:10pt"> r.</span></p><p style="margin:0pt"><span style="font-family:Arial; font-size:10pt; font-weight:bold">&#xa0;</span> 

但我想匹配包含字体重量只有这部分(最后跨距:大胆的风格)

<span style="font-family:Arial; font-size:10pt; font-weight:bold">&#xa0;</span> 
+0

我认为你应该寻找一个HTML解析器。 – HamZa

+1

[你不能用正则表达式解析XHTML。因为HTML不能被正则表达式解析。正则表达式不是一个可用于正确解析HTML的工具...](http://stackoverflow.com/a/1732454/1185053) –

+1

不要试图用正则表达式解析HTML。去获取[Html Agility Pack](http://htmlagilitypack.codeplex.com/)。 –

回答

7

使用HTML Agility Pack解析HTML:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(htmlContent); 

var boldSpans = from s in doc.DocumentNode.SelectNodes("//span") 
       let style = s.Attributes["style"].Value 
       where style.Contains("font-weight:bold") 
       select s; 

甚至更​​好的XPath,它选择在一个线上的所有节点:

doc.DocumentNode.SelectNodes("//span[contains(@style, 'font-weight:bold')]") 
+1

我其实更喜欢第一个 - 在我看来,阅读起来更容易。 –

+0

@dav_i这就是为什么我把这两个选项:) –

+2

谢谢!我有外部库生成的HTML,所以我认为HTML的结构(创建方式)将是constan。无论如何,HTML敏捷包是更好的选择:) – Kamil

0

删除^,因为它意味着行的开始。因此它会始终获得第一个跨度。更是如此,因为。*表示(任何字符)。

做到这一点,第一场比赛可能只是你现在的输出,但第二场比赛应该是你之后的比赛。

此外,诸如regexbuddy之类的工具对于测试Regex's也很有用。

0

在HTML解析中使用正则表达式是一个坏主意。使用一个库让其他人有时间花时间为你编写解析逻辑,你会更好。 HTML Agility Pack是一个伟大的.Net HTML解析器,它可以帮助你在这里。

1

不要使用^,因为该行不下手您想要匹配的跨度。

<span style=["'][^'"]*font-weight:bold[^'"]*['"]>[^<]*</span> 

或者为转义字符串:

"<span style=[\"'][^'\"]*font-weight:bold[^'\"]*['\"]>[^<]*</span>" 

这符合开头<span style=其次是单或双引号'"字符串。然后[^'"]*允许除结尾引号之外的所有字符。

匹配字符串font-weight:bold,后面跟着任意数量的字符,除了结尾qoutes导致真正的结尾qoutes和结束标记:[^'"]*['"]>

(请注意,你可能会或可能不希望让更多的属性之前和style属性之后,在这种情况下,你需要改变正则表达式)

span可能包含不同的开始标记<的任何字符的任意量,那么字符串必须以关闭</span>标签结束。