当前位置:  开发笔记 > 编程语言 > 正文

Unicode正则表达式; 无效的XML字符

如何解决《Unicode正则表达式;无效的XML字符》经验,为你挑选了3个好方法。

有效的XML字符列表是众所周知的,如规范所定义:

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

我的问题是,通过使用Unicode常规类别,是否可以为此(或其反向)制作PCRE正则表达式而不实际对代码点进行硬编码.反向可能类似于[\ p {Cc}\p {Cs}\p {Cn}],除了不正确地覆盖换行符和制表符并错过其他一些无效字符.



1> Jeff Atwood..:

我知道这不是你问题的答案,但在这里有所帮助:

正则表达式匹配有效的 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(
    @"(?
/// removes any unusual unicode characters that can't be encoded into XML
/// 
public static string RemoveInvalidXMLChars(string text)
{
    if (string.IsNullOrEmpty(text)) return "";
    return _invalidXMLChars.Replace(text, "");
}

我有我们的常驻正则表达式/ XML天才,他有4,400多个上升的帖子,检查一下,然后他签了名.


我建议不要删除无效字符,而是用替换字符 (FFFD)替换它们.剥离无效字符会使调试变得更难(问题变得不可见),并且在某些情况下会导致安全漏洞.
而不是text.IsNullOrEmpty()我认为你需要string.IsNullOrEmpty(text)

2> some..:

对于内部以UTF-16存储代码点的系统,通常使用代理对(xD800-xDFFF)用于0xFFFF以上的代码点,在这些系统中,您必须验证是否真的可以使用例如\ u12345,或者必须将其指定为代理对.(我刚发现在C#中你可以使用\ u1234(16位)和\ U0​​0001234(32位))

据微软称, "W3C建议不允许在元素或属性名称中使用代理字符." 在搜索W3s网站时,我发现了可能感兴趣的C079和C078.



3> Yuval Rimar..:

我在java中试过这个并且它有效:

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

谢谢杰夫.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有