0

我正在做一个小任务,需要使用带有 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 标记,例如:

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

我会得到这个

<strong>Placeholder 

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

编辑:

总而言之,我有没有办法将 HTML 标签中包含的字符串视为文字?覆盖字符串可能包含特殊字符的可能性(例如 > <)

4

1 回答 1

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, "</.*?>$|</.*?></.*?>$", "");
}

==> 交替中的顺序可能很重要

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

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

这也适用于 2 个以上的标签。

于 2012-10-09T07:57:34.920 回答