Использование регулярного выражения для замены специальных символов вне HTML-тегов - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь найти и заменить некоторые специальные 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 Ответ

1 голос
/ 03 июня 2019

Вы можете использовать

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

Примечания:

  • Вам необходимо экранировать obj.reg перед использованием в выражении регулярного выражения, поэтому .replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') требуется
  • Альтернативные совпадения (<[^<>]*>)| и захватывают в подстроки группы 1 <...> до требуемых совпадений и в методе обратного вызова, переданном в качестве аргумента замены, выполняется проверка соответствия первой группы. Если это так, все совпадения возвращаются как есть, иначе происходит замена.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...