检测无效的XML字符(javascript)

时间:2015-03-13 12:05:07

标签: javascript regex

昨天我提出了一个关于Detect non valid XML characters in java的问题,这个表达式按预期工作:

String xml10pattern = "[^"
                + "\u0009\r\n" // #x9 | #xA | #xD 
                + "\u0020-\uD7FF" // [#x20-#xD7FF]
                + "\uE000-\uFFFD" // [#xE000-#xFFFD] 
                + "\ud800\udc00-\udbff\udfff" // [#x10000-#x10FFFF]
                + "]";

然而,我意识到使用javascript检查客户端上的无效字符会更好,但我没有成功。

我几乎实现了,除了范围U + 10000-U + 10FFFF:http://jsfiddle.net/mymxyjaf/15/

对于最后一个范围,我试过

 var rg = /[^\u0009\r\n\u0020-\uD7FF\uE000-\uFFFD\ud800\udc00-\udbff\udfff]/g; 

但它不起作用。在regextester中,告诉“范围值反转”。我认为这是因为\ud800\udc00-\udbff\udfff被解释为3个表达式:

\ud800; \udc00-\udbff; \udfff  

当然,中间的一个失败了。

所以,我的问题是如何上面的java正则表达式转换为javascript。

感谢。

====更新====

感谢@collapsar评论,我尝试制作两个正则表达式。
因此,我意识到我无法否定角色[^...]
它会丢弃像U+10001这样的正确字符。我的意思是,不正确

function validateIllegalChars(str) {
    var re1 = /[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD]/g; 
    var re2 = /[^[\uD800-\uDBFF][\uDC00-\uDFFF]]/g;
    var str2 = str.replace(re1, '').replace(re2, ''); // First replace would remove all valid characters [#x10000-#x10FFFF]
    alert('str2:' + str2);
    if (str2 != str) return false;
    return true;
}

然后,我尝试了下一步(http://jsfiddle.net/mymxyjaf/18/):

function valPos(str) { 
    var re1 = /[\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD]/g; 
    var re2 = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;

    var str2 = str.replace(re1, '').replace(re2, ''); 
    if (str2.length === 0) return true; 
    alert('str2:' + str2 + '; length: ' + str2.length);
    return false; 
}

但是,当我调用此函数时:valPos('eo' + String.fromCharCode(65537)),其中65537 is U+10001返回false。 有什么问题或者我该如何解决?

1 个答案:

答案 0 :(得分:3)

我终于解决了。

@collapsar告诉我,我自己的问题的答案可能是:

function validateIllegalChars(str) { 

    var re1 = /[\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD]/g;  // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] 
    var re2 = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; // [#x10000-#x10FFFF]

    var res = str.replace(re1, '').replace(re2, ''); // Should remove any valid character

    if (!!res && res.length > 0) {  // any remaining characters, means input str is not valid 
        return false; 
    }

    return true; 
} 

之前的示例(我在jsfiddle中发布的那些示例)对我没有用,因为String.fromCharCode(65537)没有生成代码点U+10001的字符,正如我想的那样,但是{{1 }}。

感谢您的帮助。