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添加了解释。谢谢,效果很好。我也很欣赏这个解释:)只需一个查询,它似乎不是在转换独立的符号,例如:苹果、橙色和柠檬
。我试着使用/&&(?…
),但没有希望:/将您的示例添加到…正则表达式与该符号匹配。您能澄清这个问题吗?