【问题标题】:negative look ahead to exclude html tags否定前瞻排除 html 标签
【发布时间】:2010-04-27 21:41:08
【问题描述】:

我正在尝试提出一个验证表达式来防止用户在网页的评论框中输入 html 或 javascript 标签。

以下内容适用于单行文本:

^(?!.*(<|>)).*$

..但由于点(.),它不允许任何换行符。如果我这样做:

^(?!.*(<|>))(.|\s)*$

它将允许多行,但表达式仅匹配第一行的“”。我需要它来匹配任何行。

这很好用:

^[-_\s\d\w&quot;'\.,:;#/&\$\%\?!@\+\*\\(\)]{0,4000}$

但它很丑,而且我担心它会对某些用户造成破坏,因为它是一个多语言应用程序。

有什么想法吗?谢谢!

【问题讨论】:

  • 当我用 html 的正则表达式提问时,人们总是这样对我 - use parser :) 好的,现在说真的:你需要谈谈你使用的技术。你确定 \w 会得到非拉丁字母或奇怪的字母吗?你可以先用我的ąćęłóńśżź 喂它
  • 好的,我没有提供任何有关该技术的信息,因为我当时认为它不相关。我想是的。正则表达式将在 ASP.Net 页面上的 RegularExpressionValidator 标记中使用。所以目标是在表单提交到服务器之前验证标签不存在,客户端。

标签: regex negative-lookahead


【解决方案1】:

请注意,您的 RE 会阻止用户在任何上下文中输入 &amp;lt;&amp;gt;。例如,“2 > 1”。这是非常不可取的。

与其尝试使用regular expressions to match HTML(它们不太适合这样做),不如通过将&amp;lt;&amp;gt; 转换为&amp;lt;&amp;gt; 来逃避它们。或者,为您选择的语言找到一个包,它实现了白名单以允许有限的 HTML 子集,或者支持它自己的标记语言(我听说 markdown 很好)。

至于“。”不匹配换行符,一些正则表达式实现支持一个标志(通常“m”表示“多行”,“s”表示“单行”;后者导致“.”匹配换行符)来控制此行为。

前两个基本上等同于/^[^&lt;&gt;]*$/,除了这个适用于多行字符串。你为什么不那样写 RE 有什么原因?

【讨论】:

  • 应用程序的 DAL 已经处理转义任何“危险”字符,但我宁愿在这两个地方都这样做。我过去也注意到客户端 ASP.Net 验证器往往会阻塞任何看起来像标签的东西,所以我也试图避免这种情况。
  • 我知道到目前为止我所展示的内容将阻止任何使用 '' 并且我计划在我得到否定工作后解决这个问题。我会检查是否有一个多行标志。
【解决方案2】:

所以,我调查了一下,有一个 .Net 'SingleLine' 选项用于正则表达式导致“。”也匹配换行符。不幸的是,这在 ASP.Net RegularExpressionValidator 中不可用。据我所知,没有办法让像 ^(?!.()).$ 这样的东西在多行文本框上工作而不进行服务器端验证。

我听取了您的建议,并采取了在服务器端转义标签的路线。这需要将验证页面指令设置为“false”,但在此特定情况下,这并不是什么大问题,因为评论框确实是唯一需要担心的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多