昨天我提出了一个关于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
。
有什么问题或者我该如何解决?
答案 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 }}。
感谢您的帮助。