我创建了regex
,它应该在相邻的<span>
标记旁移动文字。
const fix = (string) => string.replace(/([\S]+)*<span([^<]+)*>(.*?)<\/span>([\S]+)*/g, "<span$2>$1$3$4</span>")
fix('<p>Given <span class="label">Butter</span>'s game, the tree counts as more than one input.</p>')
// Results in:
'<p>Given <span class="label">Butter's</span> game, the tree counts as more than one input.</p>'
但是,如果我传递一个字符串,其中没有文本触及<span>
标记,则需要几秒钟才能运行。
我正在Chrome
和Electron
进行测试。
答案 0 :(得分:4)
([\S]+)*
时, ([^<]+)*
和</span>
是导致catastrophic backtracking的罪魁祸首。您需要将正则表达式修改为
([\S]*)<span([^<]*)>(.*?)<\/span>([\S]*)
它会起作用,但仍然不是efficient。
为什么要为\S
使用字符类?以上简化为
(\S*)<span([^<]*)>(.*?)<\/span>(\S*)
如果您只关注span
的内容,请改用
<span([^<]*)>(.*?)<\/span>
检查 here &lt; =(请参阅步骤数减少)
注意:最后不要使用正则表达式解析HTML,如果有工具可以更容易地做到这一点