昨天我提出了一个关于Detect non valid XML characters in java的问题,这个表达式按预期工作:
\n\nString 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 + "]";\nRun 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; \nRun Code Online (Sandbox Code Playgroud)\n\n但它不起作用。在regextester中,告诉“范围值反转”。我认为这是因为\\ud800\\udc00-\\udbff\\udfff被解释为3个表达式:
\\ud800; \\udc00-\\udbff; \\udfff \nRun Code Online (Sandbox Code Playgroud)\n\n当然,中间那个失败了。
\n\n所以,我的问题是如何将上面的java正则表达式转换为javascript。
\n\n谢谢。
\n\n====更新====
\n\n感谢@collapsar 评论,我尝试制作两个正则表达式。
\n因此,我意识到我无法否定字符[^...]。
\n它会丢弃正确的字符,例如U+10001. 我的意思是,这是不对的:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n然后,我尝试了下一步(http://jsfiddle.net/mymxyjaf/18/):
\n\nfunction 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}\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当我调用此函数时:valPos(\'eo\' + String.fromCharCode(65537)),65537 is U+10001它返回false. \n出了什么问题或者如何解决?
我终于解决了。
正如 @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.
感谢帮助。
| 归档时间: |
|
| 查看次数: |
2823 次 |
| 最近记录: |