【问题标题】:Regex to disallow HTML tags? [duplicate]正则表达式禁止 HTML 标签? [复制]
【发布时间】:2011-05-04 18:41:30
【问题描述】:

我需要一个允许除 HTML 标记之外的任何内容的正则表达式。这里的诀窍是允许 字符 ,但它们之间不能有文本(但其他字符也可以)。

允许以下

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

以下不允许

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

我尝试了几种表达方式,但都没有成功。事实证明这比起初看起来要困难得多(无论如何对我来说:P)

编辑:基本上,任何内容都是允许的,除了:&lt;&gt; 字符之间的 A-Za-z

【问题讨论】:

  • “出乎意料地比起初看起来更难” - 这是有原因的。请在RegEx match open tags except XHTML self-contained tags 上查看已接受的答案
  • 什么语言?如果是 PHP,我会将您的字符串与 strip_tags(your_string) 进行比较。最难的部分不是写正则表达式,而是写下每一个可能的标签。

标签: html regex


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1 我必须同意正确转义比尝试删除危险文本更好。
    • 是的。试图删除“危险”的东西是错误的方法。如果您以后需要将用户输入存储在 SQL 数据库中,您还会尝试去掉引号吗?逃避是要走的路。
    • 我这样做不是为了防止注入,我这样做是因为我们调用的网络服务不允许(出于某种原因)两个尖括号之间的文本。
    • @Chris Barr:请把它放在你的问题中!否则,听起来您正在尝试解决一个非常不同(且不可能)的任务。
    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2014-06-16
    • 2015-10-02
    • 2011-10-28
    相关资源
    最近更新 更多