我在我的网络应用程序中遇到了一个错误,我不确定如何修复。
文本框将长破折号作为其内容的一部分发送给我(你知道,MS Word 有时会自动插入特殊的长破折号)。但是,我找不到替换它的方法;因为如果我尝试复制该字符并将其放入 JavaScript str.replace 语句中,它不会正确呈现并且会破坏脚本。
我怎样才能解决这个问题?
杀死它的特定角色是-。
此外,如果它有帮助,我会将值作为 GET 参数传递,然后将其编码为 XML 并将其发送到服务器。
我在我的网络应用程序中遇到了一个错误,我不确定如何修复。
文本框将长破折号作为其内容的一部分发送给我(你知道,MS Word 有时会自动插入特殊的长破折号)。但是,我找不到替换它的方法;因为如果我尝试复制该字符并将其放入 JavaScript str.replace 语句中,它不会正确呈现并且会破坏脚本。
我怎样才能解决这个问题?
杀死它的特定角色是-。
此外,如果它有帮助,我会将值作为 GET 参数传递,然后将其编码为 XML 并将其发送到服务器。
此代码可能会有所帮助:
text = text.replace(/\u2013|\u2014/g, "-");
它将所有 –
(–) 和—
(-) 符号替换为简单的破折号 (-)。
演示:http: //jsfiddle.net/F953H/
该角色称为Em Dash。您可以像这样替换它:
str.replace('\u2014', '');
这是一个示例小提琴:http: //jsfiddle.net/x67Ph/
这\u2014
称为unicode 转义序列。这些允许通过其代码指定一个 unicode 字符。2014 年恰好是 Em Dash。
您需要担心三个 unicode 长破折号:http ://en.wikipedia.org/wiki/Dash
您可以使用 unicode 转义直接替换 unicode 字符:
'—my string'.replace( /[\u2012\u2013\u2014\u2015]/g, '' )
可能会有更多这样的字符,您可能希望稍后在 html 中重用它们。一种更通用的处理方法可能是将所有“扩展字符”替换为它们的 html 编码等效项。你可以这样做:
[yourstring].replace(/[\u0080-\uC350]/g,
function(a) {
return '&#'+a.charCodeAt(0)+';';
}
);
借助 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