我需要一个允许除HTML标签之外的任何东西的正则表达式。这里的诀窍是<和>字符将被允许,但它们之间没有文字(但其他字符很好)。
允许以下 :
hello world
!@$%^&*()_+'":;[]{}()\|#
<<<<<<<
>>>>>
<>
><
<087>
<-->
以下不允许
<html>
<a>
<foo>
<bar>
我尝试了几个没有运气的表情。事实证明这比起初看起来要难得多(对我来说无论如何:P)
编辑:基本上,除了A-Z
和a-z
之间的<
和>
之外,任何内容都是允许的。
答案 0 :(得分:10)
如果您这样做是为了防止网站上的HTML注入,那么更好的解决方案是在将HTML特殊字符发送到浏览器之前将其转义。大多数Web开发环境/库都有一个标准函数来执行此操作,例如PHP具有htmlentities
和htmlspecialchars
函数。
答案 1 :(得分:1)
令人震惊的是,既然你描述了你的用例,实际上听起来像regexen会在这里工作:你需要阻止<SomeTextHere>
在没有任何限制的地方出现,当然不需要担心递归。以下正则表达式将与您想要的相反:<[A-Za-z]+>
(如果您不允许+
,则将*
更改为<>
。这个将匹配所有文本发生的地方;我建议将逻辑放在语言中(例如,if (!/<[A-Za-z]+>/) { do_something() }
)。如果你在正则表达式中需要它,并且如果你的语言支持这样的东西,你可以使用负面的前瞻断言:^(?!.*<[A-Za-z]+>)
。如果我无法找到(^
)给定文本,则表示“匹配字符串的开头((?!...)
) - 但匹配的字符串不包含任何字符。