#202020#<font face="Helvetica">this is string entered by a # user #202021# </font><b style=""><font face="Helvetica Neue" style="">#<u>001</u>10# </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> </font></b>
给出与上述类似的html字符串,我希望能够重新排列以'#'和它们之间包含的5位数字分隔的字符。
现在,我一直在尝试使用正则表达式来剥离html,然后基于'#'进行拆分,但是它不起作用,因为可能有一个'#'不在我的'#'中降价。我也不知道如何重组我的字符串块,hmtl标签和“#”数字块的拆分数组。只要将这些字符组合在一起,是否在字符串的“#12345#”部分上去除样式或移走样式都没有关系,因此可以随意在散列减价标记周围移动或包装这些字符。
发生上述情况的原因是,我有一个wysiwyg组件,该组件需要存储此'#12345#'格式的markdown,在服务器上,该组件将根据查找表转换为url。保存时,我希望能够格式化'#'降价。我使用的所见即所得编辑器是react-summernote。
答案 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#'));