我正在开发一个小字符编码器生成器,用户输入文本,点击一个按钮,就会输出编码版本。
我已经定义了需要编码的字符对象,如下所示:
map = {
'©' : '©',
'&' : '&'
},
这是从地图中获取值并替换它们的循环:
Object.keys(map).forEach(function (ico) {
var icoE = ico.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
raw = raw.replace( new RegExp(icoE, 'g'), map[ico] );
});
我是他们只是将结果输出到textarea。这一切都很好,但我面临的问题是这个。
©
已替换为©
但是,此处开头的&
符号会转换为&
,因此最终为©
。< / p>
我知道为什么会发生这种情况但是我不确定如何确保在字符编码字符串中不替换&
。
这是一个JSFiddle,用于实时预览我的意思:
非常感谢任何帮助
答案 0 :(得分:3)
前奏:除了正则表达式之外,值得考虑的一个想法就像this JS function已经处理了html实体。现在,关于正则表达式问题。
HTML特殊字符,否定前瞻
在HTML中,特殊字符不仅可以看起来像©
,还可以看起来像—
,并且它们可以包含大写字符。
要替换不会立即跟随哈希或单词字符和分号的&符号,您可以使用以下内容:
&(?!(?:#[0-9]+|[a-z]+);)
请参阅demo。
i
标志激活不区分大小写的模式&
与文字&符号相匹配(?!(?:#[0-9]+|[a-z]+);)
断言它后面没有...... (?:#[0-9]+|[a-z]+)
哈希和数字,|
或字母...... <强>参考强>
答案 1 :(得分:1)
问题在于,由于您处理相同的字符串,因此请替换&
中的©
。如果您重新订购地图,那么这似乎可以解决问题。但是根据ECMAScript specifications,这不是给定的,因此您将依赖于所使用的ECMAScript引擎的实现细节。
您可以做些什么来确保它始终有效是交换密钥,以便始终首先处理&
:
map = {
'©' : '©',
'&' : '&'
};
var keys = Object.keys(map);
keys[keys.indexOf('&')] = keys[0];
keys[0] = '&';
keys.forEach(function (ico) {
var icoE = ico.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
raw = raw.replace( new RegExp(icoE, 'g'), map[ico] );
});
显然,如果&
存在,则需要添加{{1}}存在的检查。
<强> jsFiddle Demo 强>
答案 2 :(得分:0)
最简单的代码更改可能是通过将&符放在最上面来重新排序地图。