正则表达式禁止HTML标签?

时间:2010-11-03 22:19:58

标签: html regex

我需要一个允许除HTML标签之外的任何东西的正则表达式。这里的诀窍是<和>字符被允许,但它们之间没有文字(但其他字符很好)。

允许以下

hello world
!@$%^&*()_+'":;[]{}()\|#
<<<<<<<
>>>>>
<>
><
<087>
<-->

以下不允许

<html>
<a>
<foo>
<bar>

我尝试了几个没有运气的表情。事实证明这比起初看起来要难得多(对我来说无论如何:P)

编辑:基本上,除了A-Za-z之间的<>之外,任何内容都是允许的。

2 个答案:

答案 0 :(得分:10)

如果您这样做是为了防止网站上的HTML注入,那么更好的解决方案是在将HTML特殊字符发送到浏览器之前将其转义。大多数Web开发环境/库都有一个标准函数来执行此操作,例如PHP具有htmlentitieshtmlspecialchars函数。

答案 1 :(得分:1)

令人震惊的是,既然你描述了你的用例,实际上听起来像regexen会在这里工作:你需要阻止<SomeTextHere>在没有任何限制的地方出现,当然不需要担心递归。以下正则表达式将与您想要的相反:<[A-Za-z]+>(如果您不允许+,则将*更改为<>。这个匹配所有文本发生的地方;我建议将逻辑放在语言中(例如if (!/<[A-Za-z]+>/) { do_something() })。如果你在正则表达式中需要它,并且如果你的语言支持这样的东西,你可以使用负面的前瞻断言:^(?!.*<[A-Za-z]+>)。如果我无法找到(^)给定文本,则表示“匹配字符串的开头((?!...)) - 但匹配的字符串不包含任何字符。

相关问题