我正在开展一项小作业,需要使用带有HTML字符串的正则表达式。 我当前的问题是正确获取HTML标记中包含的字符串。
例如:
我有一个字符串
<p><Placeholder></p>
我已经能够使用以下正则表达式获取内容
private string Unescape(){
string s = WebUtility.HtmlDecode("<p><Placeholder></p>");
string dec = Regex.Replace(s, "^<.*?>|^<.*?><.*?>", "");
return Regex.Replace(dec, "</.*?>$|</.*?></.*?>$", "");
}
哪会回来:
<Placeholder>
但是,如果字符串包含其他HTML标记, e.g:
<p><strong>Placeholder</strong></p>
我会得到这个
<strong>Placeholder
看起来我只能成功删除结束标记,但我不能对开始标记做同样的事情。谁能告诉我哪里出错了?
修改
总而言之,我有办法将HTML标记中包含的字符串视为文字吗?为了涵盖字符串可能包含特殊字符(例如&gt;&lt;)
的可能性答案 0 :(得分:1)
我不确定您是否会对html上的正则表达式使用感到满意,但我想解释一下“错误”匹配的问题:
替换将使用它将找到的第一个匹配,并且不会查找更多匹配项。所以当你在开始时搜索
^<.*?>|^<.*?><.*?>
字符串
<p><strong>Placeholder</strong></p>
它将匹配第一个替代品,因此它将以第一个替代品的成功匹配结束。因此,如果您想在开始时匹配<p><strong>
,则应更改交替中的顺序。但仅限于字符串开头的部分,对于字符串的结尾,您的订购是正常的。
为您的示例,这将起作用:
private string Unescape(){
string s = WebUtility.HtmlDecode("<p><Placeholder></p>");
string dec = Regex.Replace(s, "^<.*?><.*?>|^<.*?>", "");
return Regex.Replace(dec, "</.*?>$|</.*?></.*?>$", "");
}
<强> ==&GT;交替中的排序可能很重要
另一种方法是使用量词而不是替换:
string dec = Regex.Replace(s, "^(?:<.*?>)+", "");
return Regex.Replace(dec, "(?:</.*?>)+$", "");
这也适用于超过2个标签。