使用正则表达式替换html标签之外的特殊字符

时间:2019-06-03 11:01:46

标签: javascript html regex

我正在尝试查找和替换一些特殊的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: '&lt;'},
        {reg : '>', replace: '&gt;'},
        {reg : '…', replace: '&hellip;'},
        {reg : '-', replace: '&#45;'},
        {reg : "'", replace: '&#39;'},
        {reg : '\\*', replace: '&#42;'},
        {reg : ',', replace: '&sbquo;'}
    ];
    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&gt; text'

1 个答案:

答案 0 :(得分:1)

您可以使用

s = s.replace(
      new RegExp("(<[^<>]*>)|" + obj.reg.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), "g"), 
          function ($0, $1) { return $1 ? $0 : obj.replace } 
);

注意:

  • 在使用正则表达式之前,您需要escape obj.reg,因此.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')是必需的
  • (<[^<>]*>)|备用匹配项和捕获到第1组的子字符串 <...>子字符串,在要求的匹配项之前以及作为替换参数传递的回调方法中,检查是否第一组匹配。如果是这样,则将整个匹配照原样返回,否则将进行替换。