带有HTML字符串的C#正则表达式

时间:2012-10-09 06:58:03

标签: c# html regex string

我正在开展一项小作业,需要使用带有HTML字符串的正则表达式。 我当前的问题是正确获取HTML标记中包含的字符串。

例如:

我有一个字符串

<p>&lt;Placeholder&gt;</p>

我已经能够使用以下正则表达式获取内容

private string Unescape(){
    string s = WebUtility.HtmlDecode("<p>&lt;Placeholder&gt;</p>");
    string dec = Regex.Replace(s, "^<.*?>|^<.*?><.*?>", "");
    return Regex.Replace(dec, "</.*?>$|</.*?></.*?>$", "");
}

哪会回来:

<Placeholder>

但是,如果字符串包含其他HTML标记, e.g:

<p><strong>Placeholder</strong></p>

我会得到这个

<strong>Placeholder 

看起来我只能成功删除结束标记,但我不能对开始标记做同样的事情。谁能告诉我哪里出错了?

修改

总而言之,我有办法将HTML标记中包含的字符串视为文字吗?为了涵盖字符串可能包含特殊字符(例如&gt;&lt;)

的可能性

1 个答案:

答案 0 :(得分:1)

我不确定您是否会对html上的正则表达式使用感到满意,但我想解释一下“错误”匹配的问题:

替换将使用它将找到的第一个匹配,并且不会查找更多匹配项。所以当你在开始时搜索

^<.*?>|^<.*?><.*?>

字符串

<p><strong>Placeholder</strong></p>

它将匹配第一个替代品,因此它将以第一个替代品的成功匹配结束。因此,如果您想在开始时匹配<p><strong>,则应更改交替中的顺序。但仅限于字符串开头的部分,对于字符串的结尾,您的订购是正常的。

为您的示例,这将起作用:

private string Unescape(){
    string s = WebUtility.HtmlDecode("<p>&lt;Placeholder&gt;</p>");
    string dec = Regex.Replace(s, "^<.*?><.*?>|^<.*?>", "");
    return Regex.Replace(dec, "</.*?>$|</.*?></.*?>$", "");
}

<强> ==&GT;交替中的排序可能很重要

另一种方法是使用量词而不是替换:

string dec = Regex.Replace(s, "^(?:<.*?>)+", "");
return Regex.Replace(dec, "(?:</.*?>)+$", "");

这也适用于超过2个标签。