1

我需要找到一种方法来删除字体系列样式中字体名称周围的单引号。

所以这...

<span style="font-family: 'Verdana'; color: #0000ff; font-size: 10pt;"><span style="font-family: 'Arial';"><strong>2.0: Scope</strong></span></span>

会变成这样...

<span style="font-family: Verdana; color: #0000ff; font-size: 10pt;"><span style="font-family: Arial;"><strong>2.0: Scope</strong></span></span>

我只关心用引号括起来的样式属性。如果它们被单引号包围,那么我知道字体名称不会被单引号包围。

我必须在 C# 中执行此操作,因为处理此 Html 的应用程序作为 Windows 服务运行。

我知道通常使用正则表达式解析 Html 是不可以的,但我希望这可能是一个例外,因为我正在寻找一个非常具体的案例。我确实可以访问 Html 解析器,但与正则表达式相比非常慢。

这是我能想到的最好的……

var html = "<span style=\"font-family: 'Verdana'; color: #0000ff; font-size: 10pt;\"><span style=\"font-family: 'Arial';\"><strong>2.0: Scope</strong></span></span>";
var newHtml = Regex.Replace(html, "style(.*)=(.*)\"(.*)font-family:(.*?)[\">]", m => m.Value.Replace("'", ""));

它实现了正确的目标,但并没有真正找到正确的匹配项。符合这个...

style="font-family: Verdana; color: #0000ff; font-size: 10pt;"><span style="font-family: Arial;"

我想要做的是找到两个这样的匹配......

style="font-family: 'Verdana'; color: #0000ff; font-size: 10pt;"
style="font-family: 'Arial';"

作为一个正则表达式新手,我似乎找不到正确的组合。

或者更具体地说,我需要一种方法来在由单引号包围的字体系列中找到一个值,然后从该值中删除单引号。

有人可以帮我想出适当的正则表达式吗?
在这种情况下,是否有替代正则表达式可以更好地工作?

4

3 回答 3

1

这是我解决它的方法...

var html = "<span style=\"font-family: 'Verdana'; color: #0000ff; font-size: 10pt;\"><span style=\"font-family: 'Arial';\"><strong>2.0: Scope</strong></span></span>"; 
var newHtml = Regex.Replace(html, "style\\s*=\\s*\"[^\"]*\\bfont-family:.*?'.*?(;|\")", m => m.Value.Replace("'", "");

感谢 Lou 引导我朝着正确的方向前进。

于 2012-06-15T00:57:06.247 回答
1

发生这种情况是因为正则表达式匹配是贪婪的——它会尝试匹配最长的匹配字符串。

var newHtml = Regex.Replace(html, "style(.*)=(.*)\"(.*)font-family:(.*?)[\">]", m => m.Value.Replace("'", ""));

你的问题是(.*?)字体系列之后 - 它甚至会继续过去关闭标签。一个简单的解决方法是

var newHtml = Regex.Replace(html, "style(.*)=(.*)\"(.*)font-family:([^>]*?)[\">]", m => m.Value.Replace("'", ""));

^in[^>]表示不是这些字符。

当然,这些都是 hack —— 肯定有真正的 HTML 是行不通的。

于 2012-06-14T20:01:34.043 回答
0

将您进入此函数的每个字符串传递给:

private static string RemoveSingleQuote(string psHTML) {
    // If it starts with the single quote after "style=" then, just return the string.
    if (psHTML.StartsWith("<span style=\'")) return (psHTML);

    StringBuilder sb = new StringBuilder();

    foreach (char c in psHTML) {
        if (c != '\'') {
            sb.Append(c);
        }
    }

    return (sb.ToString());
}
于 2012-06-14T20:11:29.997 回答