检测无效的 XML 字符 (javascript)

Alb*_*ert 4 javascript regex

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

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

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

\n\n

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

\n\n

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

\n\n
 var rg = /[^\\u0009\\r\\n\\u0020-\\uD7FF\\uE000-\\uFFFD\\ud800\\udc00-\\udbff\\udfff]/g; \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\\ud800; \\udc00-\\udbff; \\udfff  \n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,中间那个失败了。

\n\n

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

\n\n

谢谢。

\n\n

====更新====

\n\n

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

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

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

\n\n
function valPos(str) { \n    var re1 = /[\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD]/g; \n    var re2 = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\n    var str2 = str.replace(re1, \'\').replace(re2, \'\'); \n    if (str2.length === 0) return true; \n    alert(\'str2:\' + str2 + \'; length: \' + str2.length);\n    return false; \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我调用此函数时:valPos(\'eo\' + String.fromCharCode(65537))65537 is U+10001它返回false. \n出了什么问题或者如何解决?

\n

Alb*_*ert 6

我终于解决了。

正如 @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; 
} 
Run Code Online (Sandbox Code Playgroud)

前面的示例(我在 jsfiddle 中发布的示例)对我不起作用,因为正如我所想的那样,String.fromCharCode(65537)没有使用代码点生成字符U+10001,但是U+0001.

感谢帮助。