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

How to parse an html string based on certain delimiters?

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

您可以使用 string.replace、正则表达式和回调来执行此操作。 正则表达式

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

寻找两个 # 封闭的数字和任何不是 #.

的东西

在回调中,您删除所有非数字字符,并计算剩余的数字。如果有五个数字,你 return 包含在 # 中的数字,否则,你什么都不做,你只是 return 原始标签。

您还可以使用积极的前瞻和后视来不捕获 #,在这种情况下,您不需要在替换标签时包含哈希值

/(?<=#)([^#]*\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#'));