Как составить регулярное выражение исходя из следующих условий?

Доброго всем дня! Столкнулся со следующей проблемой: Мне необходимо заменить спец символы. Делаю сейчас это следующим способом :
this.replaceStandardHtmlEntities = (text) => {
                let regular = /( {2}|&|'|<|>|\\n)/g,
                    translate = {
                        '  ': '&nbsp',
                        '&': '&amp',
                        '\'': '&quot',
                        '<': '&lt',
                        '>': '&gt',
                        '\\n': '<br>'
                    };

                return (text.replace(regular, (match, entity) => {
                    return translate[entity];
                }));
            };


Но моя задача немного усложнилась, мне необходимо игнорировать 'a' тэг, к примеру:
<a href = http://stackoverflow.com/questions/19006441/html-regex-ignore-tags>stackoverflow.com/questions/19006441/html-regex-ignore-tags</a>

Содержимое тэга, т.е (stackoverflow.com/questions/19006441/html-regex-ignore-tags) не должно игнорироваться. Регулярка на матч тэга есть
(?!<\/?a+((\s+\w+(\s*=\s*(?:\".*?"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>)

а вот совместить эти вещи, увы не получается.
Буду вам очень благодарен за любую помощь, т.к бьюсь с этой проблемой целый день =(
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
В ситуациях, когда нужно изолировать фрагменты текста от обработки, проще всего перед обработкой их маскировать. Заменить на что-нибудь, что точно не попадет под обработку. А после обработки вернуть назад.

this.replaceStandardHtmlEntities = (text) => {
  // маскируем ссылки
  text = text.replace(/\<a([^\>]*)\>/g, String.fromCharCode(1) + 'a$1' + String.fromCharCode(1));
  text = text.replace(/\<\/a\>/g, String.fromCharCode(1) + '/a' + String.fromCharCode(1));

  // остальной код без изменений
  let regular = /( {2}|&|'|<|>|\\n)/g, translate = {
    '  ': '&nbsp',
    '&': '&amp',
    '\'': '&quot',
    '<': '&lt',
    '>': '&gt',
    '\\n': '<br>'
  };

  // результат замены передаем в переменную
  let result = (text.replace(regular, (match, entity) => {
    return translate[entity];
  }));
  
  // возвращаем ссылки обратно
  result = result.replace(/\x01a([^\x01]*)\x01/g, '<a$1>');
  result = result.replace(/\x01\/a\x01/g, '</a>');
  
  return result;
};

Смотреть в JSFiddle
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы