2011-09-21 81 views
1

我正在使用umbraco字段的验证由正则表达式完成。在一个字段中,我想让用户使用富文本编辑器(tinymce)设置文本的样式,但我仍然想限制它们可以输入的字符数。正则表达式验证长度字符串,不包括html标记

我目前使用这个正则表达式,但它检查字符的总数,所以包括html。

^[\s\S]{0,250}$ 

是否有一个正则表达式不会计算html标记中的字符。

回答

1

简短的回答是否定的。至少,没有任何理智的正则表达式,没有一个先进的正则表达式引擎,允许递归或平衡组,也许根本没有。可以识别并忽略HTML标记的正则表达式必须解析HTML做到这一点,并down that road lies madness.

但是,你可以使用某种形式的预处理,如jQuery在客户端或别的东西上服务器端,解析HTML并在之前剥去标签,然后应用长度验证。

您确定要这么做吗?如果您将样式化的输入存储在数据库中,那么这些HTML标记将与您的列大小相同,就像其他所有内容一样。如果将这些数据存储在varchar(250)列中,则必须将这些HTML标记计数为250的一部分,否则将它们除去并丢失所有样式信息。

+0

该限制是因为它适合于具有设定高度的盒子。 – suzyb

+0

好的。在这种情况下,我建议使用jQuery或类似的东西来代替正则表达式。你可以用这种方式正确地解析HTML,你甚至可以设置一个onkeyup事件来检查这个盒子是否已满。或者,如果这是您的选择,您可以将该框扩展。 –

+0

无论哪种方式,使用正则表达式来做到这一点的问题是相同的。 –

0

因为您试图检测的文法是 而不是 上下文无关,所以一步完成这将很难(几乎不可能)。两步很简单;只需要首先执行s/<.+?>//替换以移除所有标签,然后再次计数。

在相关说明上,你的正则表达式有点傻。您可以使用.字符来表示任何字符;你不必做你正在使用的“空白或非空白”技巧。

^.{0,250}$ 
+0

'[\ S \ s]'技巧无疑用来匹配'\ n'字符。除非多线模式打开,'.'不会匹配换行符。此外,[HTML是上下文无](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1758162#1758162),这实际上是问题。上下文无关文法比较复杂。 –

+0

也可能值得一提的是,有有效的HTML会打破这个正则表达式。 ''

+0

@Justin:...在JavaScript中,没有多行模式,因此'[\ s \ S]'是“任何字符,甚至是换行符”的常用成语。 –