如何基于某些定界符来解析html字符串?

时间:2019-02-24 18:41:37

标签: javascript regex html-parsing

#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#'格式的markdown,在服务器上,该组件将根据查找表转换为url。保存时,我希望能够格式化'#'降价。我使用的所见即所得编辑器是react-summernote。

1 个答案:

答案 0 :(得分:0)

您可以使用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#'));