0

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

以下适用于单行文本:

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

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

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

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

这工作正常:

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

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

有任何想法吗?谢谢!

4

2 回答 2

1

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

与其尝试使用正则表达式来匹配 HTML(它们不太适合这样做),不如简单地转义<并将>它们转换为&lt;and &gt;。或者,为您选择的语言找到一个包,它实现了白名单以允许有限的 HTML 子集,或者支持它自己的标记语言(我听说markdown很好)。

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

前两个基本上等同于/^[^<>]*$/,除了这个适用于多行字符串。你有什么理由不那样写RE?

于 2010-04-27T21:47:37.690 回答
0

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

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

于 2010-04-29T02:58:50.950 回答