如何在例外的javascript中删除所有html标签?

时间:2010-03-06 15:15:30

标签: javascript regex

我现在最长时间一直在打击这个前任,我希望有人可以提供帮助。基本上我有一个WYSIWYG字段,用户可以在其中键入格式化文本。但他们当然会复制并粘贴表格/网页等。所以我有一个JS函数捕获粘贴的输入。我有一个功能会删除文本上的所有格式,这很好,但我想让它留下像p和br这样的标签,所以它不仅仅是一个大混乱。

那里有任何正则表达的忍者吗?这是我到目前为止所做的工作。只需要允许标签。

o.node.innerHTML=o.node.innerHTML.replace(/(<([^>]+)>)/ig,"");

2 个答案:

答案 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)断言无法匹配零个或多个空白字符,零个或一个/brp中的任意一个,后面跟着一个字边界。单词边界很重要,否则您可能会在<pre><param ...>等标签上触发前瞻。

[^>]+匹配一个或多个没有右尖括号的字符

>匹配结束尖括号。

请注意,如果在标记内某处出现结束尖括号,则可能会遇到麻烦。

所以这将匹配(和剥离)

<pre> <a href="dot.com"> </a> </pre>

并离开

<p> < p > < /br > <br /> <br>等。

单独