如何根据某些分隔符解析html字符串?

问题描述 投票:0回答:1

#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#'部分删除或移出样式并不重要,只要这些字符被分组,因此它们可以任意移动或包裹在散列降序处。

上面的原因是我有一个所见即所得的组件,需要存储这个'#12345#'格式的markdown,在服务器上,它会根据查找表转换为url。在保存时,我希望能够格式化'#'降价。我正在使用的所见即所得的编辑是反应 - 夏令营。

javascript regex html-parsing
1个回答
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#'));
© www.soinside.com 2019 - 2024. All rights reserved.