解析引号标记出html样式属性

时间:2012-06-14 19:18:53

标签: c# html

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

所以这......

<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';"

作为一名新手正则表达家伙,我似乎找不到合适的组合。

或者更具体地说,我需要一种方法来查找由单引号括起来的font-family中的值,然后从该值中删除单引号。

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

3 个答案:

答案 0 :(得分:1)

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

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

你的问题是{-1}}在font-family之后 - 它会继续经过关闭标签。一个简单的解决方法是

(.*?)

var newHtml = Regex.Replace(html, "style(.*)=(.*)\"(.*)font-family:([^>]*?)[\">]", m => m.Value.Replace("'", "")); 中的^表示不是这些字符。

当然,这些都是黑客 - 肯定是真正的HTML,这将无法正常工作。

答案 1 :(得分: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指导我朝着正确的方向前进。

答案 2 :(得分: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());
}