47

有効な XML 文字のリストはよく知られており、仕様で次のように定義されています。

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

私の質問は、Unicode の一般的なカテゴリを使用して、コードポイントを実際にハードコーディングせずに、これ (またはその逆) の PCRE 正規表現を作成できるかどうかです。逆は [\p{Cc}\p{Cs}\p{Cn}] のようなものかもしれませんが、改行とタブが不適切にカバーされ、他の無効な文字がいくつか見落とされています。

4

6 に答える 6

93

これがあなたの質問に対する正確な答えではないことは知っていますが、ここにあると役に立ちます:

有効なXML文字に一致する正規表現:

[\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]

したがって、無効な文字をXMLから削除するには、次のようにします。

// filters control characters but allows only properly-formed surrogate sequences
private static Regex _invalidXMLChars = new Regex(
    @"(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]",
    RegexOptions.Compiled);

/// <summary>
/// removes any unusual unicode characters that can't be encoded into XML
/// </summary>
public static string RemoveInvalidXMLChars(string text)
{
    if (string.IsNullOrEmpty(text)) return "";
    return _invalidXMLChars.Replace(text, "");
}

私は私たちの常駐正規表現/XMLの天才、4,400以上の賛成の投稿の彼を持っていました、これをチェックしてください、そして彼はそれを承認しました。

于 2009-06-07T08:30:38.443 に答える
6

私はJavaでこれを試してみましたが、うまくいきます:

private String filterContent(String content) {
    return content.replaceAll("[^\\u0009\\u000a\\u000d\\u0020-\\uD7FF\\uE000-\\uFFFD]", "");
}

ジェフありがとう。

于 2012-02-19T16:57:22.077 に答える
6

コードポイントをUTF-16で内部的に格納するシステムでは、 0xFFFF を超えるコードポイントにサロゲート ペア (xD800-xDFFF) を使用するのが一般的です。これらのシステムでは、たとえば \u12345 を本当に使用できるかどうかを確認するか、それをサロゲートペア。(C# では\u1234 (16 ビット) と \U00001234 (32 ビット) を使用できることがわかりました)

Microsoftによると、「W3C 勧告では、要素または属性名内に代理文字を使用することは許可されていません。」W3s の Web サイトを検索しているときに、興味深いと思われるC079C078を見つけました。

于 2008-12-29T07:32:07.593 に答える