1

font-familyスタイルのフォント名を囲む一重引用符を削除する方法を見つける必要があります。

したがって、この...

<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>

二重引用符で囲まれたスタイル属性のみが気になります。それらが一重引用符で囲まれている場合、フォント名は一重引用符で囲まれないことがわかります。

このHTMLを処理するアプリケーションはWindowsサービスとして実行されているため、C#内でこれを行う必要があります。

通常、正規表現を使用して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;"

私がやりたいのは、このような2つの一致を見つけることです...

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

初心者の正規表現の人である私は、正しい組み合わせを見つけることができないようです。

または、より具体的には、一重引用符で囲まれたフォントファミリ内の値を見つけて、その値から一重引用符を削除する方法が必要です。

誰かが私が適切な正規表現を思い付くのを手伝ってもらえますか?
このシナリオでより適切に機能する正規表現の代替手段はありますか?

4

3 に答える 3

1

これは、正規表現の一致が貪欲であるために発生します。一致する最長の文字列を一致させようとします。

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

あなたの問題は(.*?)afterfont-familyです-それはcloseタグを過ぎても行き続けます。簡単な修正は

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

^inは、これらの[^>]文字ではないことを意味します。

もちろん、これらはすべてハックです。これが機能しない実際のHTMLは間違いなくあります。

于 2012-06-14T20:01:34.043 に答える
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 に答える
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 に答える