Как разобрать строку html на основе определенных разделителей? - PullRequest
0 голосов
/ 24 февраля 2019

#202020#<font face="Helvetica">this is string entered by a # user #202021# </font><b style=""><font face="Helvetica Neue" style="">#<u>001</u>10#&nbsp;</font></b>

Ожидаемый результат: #202020#<font face="Helvetica">this is string entered by a # user #202021# </font><b style=""><font face="Helvetica Neue" style="">#00110#<u></u>&nbsp;</font></b>

Учитывая строку html, подобную приведенной выше, я хочу иметь возможность переставлять символы, разделенные символами # и 5 цифрами.числа, включенные между ними.

Прямо сейчас я пытался использовать регулярные выражения, чтобы вырезать HTML, а затем разделить на основе '#', но это не работает, потому что может быть '#', который не является частью моего'#' уценка.Я также не знаю, как рекомбинировать мои расщепленные массивы строк, тегов hmtl и номеров «#».Неважно, удаляю я или удаляю стиль в части строки # 12345 #, пока эти символы сгруппированы, так что они могут быть произвольно перемещены или обернуты вокруг уценки хеша.

Причина вышеизложенного состоит в том, что у меня есть компонент wysiwyg, который требует хранения отформатированной разметки '# 12345 #', где на сервере она преобразуется в URL-адрес на основе таблицы поиска.При сохранении я хочу иметь возможность отформатировать '#' уценку.Редактор wysiwyg, который я использую, является response-summernote.

1 Ответ

0 голосов
/ 24 февраля 2019

Вы можете сделать это, используя string.replace, регулярное выражение и обратный вызов.Регулярное выражение

/#([^#]*\d)#/g

ищет два # включающих числа и все, что не является #.

. В обратном вызове вы удаляете все нецифровые символы и считаетеоставшиеся номера.Если имеется пять чисел, вы возвращаете числа, заключенные в #, в противном случае вы ничего не делаете, вы просто возвращаете исходный тег.

Вы также можете использовать положительный взгляд и взгляд назад, чтобы не захватить #в этом случае вам не нужно будет включать хэши при замене тега

/(?<=#)([^#]*\d)(?=#)/g

const func = str => str.replace(/(?<=#)([^#]*\d)(?=#)/g, (a, tag) => {
  const numbers = tag.replace(/\D/g, ''); // remove non-digits
  if (numbers.length === 5) {
    return numbers; // return the numbers part of the tag
  }
  return tag; // return tag untouched
});

console.log(func('#12<b>345</b>6#'));
console.log(func('#1<b>2</b>34#'));
console.log(func('#12345#'));
console.log(func('#1<b>234</b>5#'));
...