【问题标题】:Regex won't find '\u2028' unicode characters正则表达式找不到 '\u2028' unicode 字符
【发布时间】:2010-06-30 05:31:09
【问题描述】:

我们在追踪用户提交的数据中的 \u2028(行分隔符)的来源时遇到了很多麻烦,这会导致 Firefox 中出现“未终止的字符串文字”错误。

因此,我们正在考虑在将其提交到服务器(然后是数据库)之前将其过滤掉。

在大量搜索和阅读其他人的问题之后,很明显我必须在提交到数据库之前过滤掉这些字符。

在编写过滤器之前,我尝试搜索字符以确保它可以使用以下方法找到它:

var index = content.search("/\u2028/");
alert("Index: [" + index + "]");

我每次都得到 -1 作为结果,即使我知道字符在内容变量中(我已通过服务器端的 Java jUnit 测试确认)。

假设 content.replace() 的工作方式与 search() 相同,为了查找和去除这些行分隔符,我是否做错了什么或遗漏了什么?

【问题讨论】:

  • 你的编码是什么?在 HTML 中则不同:fileformat.info/info/unicode/char/2028/index.htm
  • 编码无关紧要,@Peter。 JavaScript \u 转义总是使用十六进制代码点。
  • 谢谢@Matthew。所以基本上通过使用 \u 你可以让 JavaScript 做任何必要的转换。
  • Unicode 字符全部从 0 到 0x10FFFF(理论最大值)连续编号。代码点只是分配的数字。 JS 字符串文字、该页面的标题等使用它。 UTF-8 将特定的字节序列映射到每个代码点,但这与此处无关。

标签: javascript regex firefox unicode


【解决方案1】:

您的正则表达式语法不正确。使用正则表达式文字时,您只能使用两个正斜杠。它应该只是:

var index = content.search("\u2028");

或:

var index = content.search(/\u2028/); // regex literal

但这真的应该在服务器上完成,如果在任何地方。可以轻松绕过 JavaScript 清理。它只是为了方便用户使用,我认为意外输入行分隔符并不常见。

【讨论】:

  • @Cyntech:如果你真的需要它成为 RegExp 的一部分:var index = content.search(/\u2028/);(带斜线,但不带引号)。
  • 感谢马修和 TJ。这样就解开了谜底。我还能够成功替换 u2028 字符。但是,我还读到我可能也应该过滤掉 u2029。当我使用 content.replace(/\u2028\u2029/g," "); 时,它不会替换任何内容(甚至不会替换 u2028 字符)。多次搜索的语法是否错误?
  • 其实我想我刚刚解决了... content.replace(/\u2028|\u2029/g, ' ');这是正确的吗?
  • @Cyntech,通常,对于单个字符,您使用字符类:/[\u2028\u2029]/g。并且不要忘记您也需要在服务器上执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2011-03-02
  • 2010-09-26
  • 2014-10-13
相关资源
最近更新 更多