17

我在我的网络应用程序中遇到了一个错误,我不确定如何修复。

文本框将长破折号作为其内容的一部分发送给我(你知道,MS Word 有时会自动插入特殊的长破折号)。但是,我找不到替换它的方法;因为如果我尝试复制该字符并将其放入 JavaScript str.replace 语句中,它不会正确呈现并且会破坏脚本。

我怎样才能解决这个问题?

杀死它的特定角色是-。

此外,如果它有帮助,我会将值作为 GET 参数传递,然后将其编码为 XML 并将其发送到服务器。

4

5 回答 5

42

此代码可能会有所帮助:

text = text.replace(/\u2013|\u2014/g, "-");

它将所有 –(–) 和—(-) 符号替换为简单的破折号 (-)。

演示:http: //jsfiddle.net/F953H/

于 2012-05-03T17:38:19.760 回答
3

该角色称为Em Dash。您可以像这样替换它:

str.replace('\u2014', '');​​​​​​​​​​

这是一个示例小提琴:http: //jsfiddle.net/x67Ph/

\u2014称为unicode 转义序列。这些允许通过其代码指定一个 unicode 字符。2014 年恰好是 Em Dash。

于 2012-05-03T17:38:52.900 回答
2

您需要担心三个 unicode 长破折号:http ://en.wikipedia.org/wiki/Dash

您可以使用 unicode 转义直接替换 unicode 字符:

'—my string'.replace( /[\u2012\u2013\u2014\u2015]/g, '' )
于 2012-05-03T17:40:16.710 回答
2

可能会有更多这样的字符,您可能希望稍后在 html 中重用它们。一种更通用的处理方法可能是将所有“扩展字符”替换为它们的 html 编码等效项。你可以这样做:

[yourstring].replace(/[\u0080-\uC350]/g, 
                      function(a) {
                        return '&#'+a.charCodeAt(0)+';';
                      }
);
于 2012-05-03T17:52:35.603 回答
1

借助 ECMAScript 2018 标准,JavaScriptRegExp现在支持 Unicode 属性(或类别)类。其中之一\p{Dash},匹配任何 Unicode 字符点,即破折号:

/\p{Dash}/gu

在 ES5 中,等价的表达式是:

/[-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2053\u207B\u208B\u2212\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]|\uD803\uDEAD/g

请参阅Unicode 实用程序参考

以下是一些 JavaScript 示例:

const text = "Dashes: \uFF0D\uFE63\u058A\u1400\u1806\u2010-\u2013\uFE32\u2014\uFE58\uFE31\u2015\u2E3A\u2E3B\u2053\u2E17\u2E40\u2E5D\u301C\u30A0\u2E1A\u05BE\u2212\u207B\u208B\u3030";
const es5_dash_regex = /[-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2053\u207B\u208B\u2212\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]|\uD803\uDEAD/g;
console.log(text.replace(es5_dash_regex, '-')); // Normalize each dash to ASCII hyphen
// => Dashes: ----------------------------

要匹配一个或多个破折号并替换为单个字符(或一次性删除):

/\p{Dash}+/gu
/(?:[-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2053\u207B\u208B\u2212\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]|\uD803\uDEAD)+/g
于 2021-12-15T10:19:35.287 回答