我现在最长时间一直在打击这个前任,我希望有人可以提供帮助。基本上我有一个WYSIWYG字段,用户可以在其中键入格式化文本。但他们当然会复制并粘贴表格/网页等。所以我有一个JS函数捕获粘贴的输入。我有一个功能会删除文本上的所有格式,这很好,但我想让它留下像p和br这样的标签,所以它不仅仅是一个大混乱。
那里有任何正则表达的忍者吗?这是我到目前为止所做的工作。只需要允许标签。
o.node.innerHTML=o.node.innerHTML.replace(/(<([^>]+)>)/ig,"");
答案 0 :(得分:9)
浏览器在o.node
中已经有一个非常好的解析HTML树。将文档内容序列化为HTML(使用innerHTML
),尝试使用正则表达式(无法可靠地解析HTML)破解它,然后通过设置{将结果重新解析回文档内容{1}} ......真的有点不正常。
相反,检查innerHTML
中已有的元素和属性节点,删除不需要的节点,例如:
o.node
定义为:
filterNodes(o.node, {p: [], br: [], a: ['href']});
答案 1 :(得分:3)
首先,我不确定正则表达式是否是正确的工具。用户可能会输入无效的HTML(忘记>
或将>
置于属性内),然后正则表达式将失败。但是,我不知道解析器是否会更好/更具防弹性。
其次,你的正则表达式中有一些不必要的括号。
第三,您可以使用前瞻来排除某些标签:
o.node.innerHTML=o.node.innerHTML.replace(/<(?!\s*\/?(br|p)\b)[^>]+>/ig,"");
说明:
<
匹配开场角括号
(?!\s*\/?(br|p)\b)
断言无法匹配零个或多个空白字符,零个或一个/
,br
或p
中的任意一个,后面跟着一个字边界。单词边界很重要,否则您可能会在<pre>
或<param ...>
等标签上触发前瞻。
[^>]+
匹配一个或多个没有右尖括号的字符
>
匹配结束尖括号。
请注意,如果在标记内某处出现结束尖括号,则可能会遇到麻烦。
所以这将匹配(和剥离)
<pre> <a href="dot.com"> </a> </pre>
并离开
<p> < p > < /br > <br /> <br>
等。
单独