我正在尝试查找和替换一些特殊的html实体,即'&'转换为&
,'>'转换为>
。这是用于电子邮件构建器工具,某些较旧的客户端需要用html实体替换字符。
用户通过字符串,而我使用javascript遍历对象数组。这将找到一个字符并将其替换为正确的html实体。
您可以在此处查看我正在使用的正则表达式代码:
https://regex101.com/r/WZh5tA/2
escapeCharacter: function(string){
var replaceChar = [
{reg : '&', replace: '&'},
{reg : '"', replace: '"'},
{reg : '£', replace: '£'},
{reg : '€', replace: '€'},
{reg : 'é', replace: 'é'},
{reg : '–', replace: '–'},
{reg : '®', replace: '®'},
{reg : '™', replace: '™'},
{reg : '‘', replace: '‘'},
{reg : '’', replace: '’'},
{reg : '“', replace: '“'},
{reg : '”', replace: '”'},
{reg : '#', replace: '#'},
{reg : '©', replace: '©'},
{reg : '@', replace: '@'},
{reg : '$', replace: '$'},
{reg : '\\(', replace: '('},
{reg : '\\)', replace: ')'},
{reg : '<', replace: '<'},
{reg : '>', replace: '>'},
{reg : '…', replace: '…'},
{reg : '-', replace: '-'},
{reg : "'", replace: '''},
{reg : '\\*', replace: '*'},
{reg : ',', replace: '‚'}
];
var s = string;
replaceChar.forEach(function(obj){
var regEx = new RegExp(obj.reg+"(?!([^<]+)?>)", "g");
s = s.replace(regEx, obj.replace);
});
return s
}
当用户传递带有html标记的字符串(应允许这样做)时,会发生问题。例如,字符串可以是:
'This is an example of some <b>bold</b> text'
我的查找和替换工具很神奇,但是我想我丢失了一些东西,因为得到了以下输出:
'This is an example of some <b>bold</b> text'
答案 0 :(得分:1)
您可以使用
s = s.replace(
new RegExp("(<[^<>]*>)|" + obj.reg.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), "g"),
function ($0, $1) { return $1 ? $0 : obj.replace }
);
注意:
obj.reg
,因此.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
是必需的(<[^<>]*>)|
备用匹配项和捕获到第1组的子字符串 <...>
子字符串,在要求的匹配项之前以及作为替换参数传递的回调方法中,检查是否第一组匹配。如果是这样,则将整个匹配照原样返回,否则将进行替换。