Javascript 正则表达式转换&;至&;amp;

Javascript 正则表达式转换&;至&;amp;,javascript,regex,replace,Javascript,Regex,Replace,我正在开发一个小字符编码器生成器,用户在其中输入文本,点击一个按钮,它就会输出编码版本 我定义了一个需要编码的字符对象,如下所示: map = { '©' : '©', '&' : '&' }, 下面是从映射中获取值并替换它们的循环: Object.keys(map).forEach(function (ico) { var icoE = ico.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1

我正在开发一个小字符编码器生成器,用户在其中输入文本,点击一个按钮,它就会输出编码版本

我定义了一个需要编码的字符对象,如下所示:

map = {
    '©' : '©',
    '&' : '&'
},
下面是从映射中获取值并替换它们的循环:

Object.keys(map).forEach(function (ico) {
    var icoE   = ico.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
    raw = raw.replace( new RegExp(icoE, 'g'), map[ico] );
});
我希望他们只是将结果输出到文本区域。这一切都很好,但我面临的问题是

替换为
©
但是,开头的
&
符号随后会转换为
&因此它最终是
&;抄袭

我明白为什么会发生这种情况,但是我不确定如何确保
&
不会在字符编码字符串中被替换

下面是一个JSFIDLE,可以实时预览我的意思:


任何帮助都将不胜感激。

前奏:除了正则表达式之外,一个值得考虑的想法是,它已经处理了html实体。现在,转到正则表达式问题

HTML特殊字符,负前瞻

在HTML中,特殊字符不仅看起来像
©
但也像
,并且可以使用大写字符

要替换后面不紧跟哈希或单词字符和分号的符号,可以使用以下方法:

&(?!(?:#[0-9]+|[a-z]+);)

  • 确保使用
    i
    标志激活不区分大小写模式
  • &
    匹配文字符号和
  • 负前瞻
    (?!(?:#[0-9]+|[a-z]+)
    断言它后面没有
  • (?:#[0-9]+|[a-z]+)
    散列和数字、
    |
    或字母
  • 然后是分号
参考


最简单的代码更改可能是通过将符号置于上方来重新排列地图。

问题在于,由于您处理相同的字符串,因此在
©。如果你重新整理你的地图,那么这似乎解决了问题。然而,根据,这不是一个给定的,所以您将依赖于所使用的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] );
});
显然,如果
&
不总是存在,您需要添加对其存在性的检查


“&>”.split(“”).map(函数(char){returnmap[char]| | char;}).join(“”)第一个问题:如果原始文本?它应该被替换,还是单独使用?@NiettheDarkAbsol-这永远不会是这样,因为这个生成器是一个内部项目,用于工作,用于那些为博客文章等撰写副本的人。“这永远不会是这样”是所有错误的根源。我已经想到了这一点,但无法找到解决方法。是否可能只检测分号,因为有时可能会有一个符号,后面跟着一个单词。例如,M&SFYI添加了解释。谢谢,效果很好。我也很欣赏这个解释:)只需一个查询,它似乎不是在转换独立的符号,例如:
苹果、橙色和柠檬
。我试着使用
/&&(?…
),但没有希望:/将您的示例添加到…正则表达式与该符号匹配。您能澄清这个问题吗?