正则表达式(C#flavor)在标题标记之后获取第一个<p> </p>

时间:2009-05-06 22:29:54

标签: c# asp.net regex

我的网站几乎已经完成了一个引用系统,但最后有一个嘻嘻哈哈的正则表达式,我无法做对。

我所追求的是引用页面的摘录,我在其中定义了最相关的摘录:

第一段(由<p></p>标记标记),位于页面HTML源代码中的<h1></h1><h2></h2><h3></h3>之后。

例如,我可以按如下方式成功获取HTML的<title></title>标记:

Regex reTITLE = new Regex( @"(?<=<title.*>)([\s\S]*)(?=</title>)",
RegexOptions.IgnoreCase );

Match match = reTITLE.Match( strHTMLSource );
if (match.Success)
    {
        strReferringPageTitle = match.Value.Trim( );
    }

我的问题 - 我可以使用正则表达式来获取帖子第一部分中描述的字符串吗?

PS:我喜欢StackOverflow和这个社区 - 很棒的工作,Joel&amp;有限公司!

4 个答案:

答案 0 :(得分:2)

Match m = Regex.Match(strHTMLSource, "^.*?</h[123]>.*?<p>(.*?)</p>",
    RegexOptions.Compiled | RegexOptions.IgnoreCase);

string para = m.Success ? m.Groups[1].Value.Trim() : string.Empty;

答案 1 :(得分:1)

就我个人而言,我会使用XPath查询来完成你想要实现的目标,比使用正则表达式更容易。

答案 2 :(得分:0)

此正则表达式将在h1,h2或h3之后找到所有第一段。如果您只想要页面上的第一段,请保留第一个匹配。

(?<=</h[1-3]>\s*?<p>)([\s\S]*?)(?=</p>)

您可能需要调整<p>代码的匹配项以考虑属性。

答案 3 :(得分:0)

有很多用例,正则表达式无法正常工作。例如:

<p>foo<p>bar</p>baz</p>

<p>This paragraph is valid <!-- <p>This one isn't</p> --> </p>

捕获<p></p>之间文本的正则表达式将分别捕获:

foo<p>bar

This paragraph is valid <!-- <p>This one isn't

如果我必须处理野外发现的HTML,我会使用MSHTML来解析HTML,然后搜索DOM以查找对象。

使用MSHTML并不像使用正则表达式那样轻巧。但MSHTML旨在从最薄弱的网页中理解。我更倾向于使用它所设计用来处理的凌乱的现实世界用例的所有知识而不是为自己发现它们。

请参阅this问题的答案,了解一些示例代码。