Regex 用于验证长度字符串而不包含html标记的正则表达式

Regex 用于验证长度字符串而不包含html标记的正则表达式,regex,umbraco,Regex,Umbraco,我使用的是umbraco,其中字段的验证是通过正则表达式完成的。在一个字段中,我希望允许用户使用富文本编辑器(tinymce)设置文本样式,但我仍然希望限制用户可以输入的字符数 我目前正在使用这个正则表达式,但它会检查字符总数,因此包含html ^[\s\S]{0,250}$ 是否有一个正则表达式不计算html标记中的字符数。简短的答案是否定的。至少,没有任何健全的正则表达式,没有允许递归或平衡组的高级正则表达式引擎,或者根本没有。一个能够识别和忽略HTML标记的正则表达式必须解析HTML才能

我使用的是umbraco,其中字段的验证是通过正则表达式完成的。在一个字段中,我希望允许用户使用富文本编辑器(tinymce)设置文本样式,但我仍然希望限制用户可以输入的字符数

我目前正在使用这个正则表达式,但它会检查字符总数,因此包含html

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

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

简短的答案是否定的。至少,没有任何健全的正则表达式,没有允许递归或平衡组的高级正则表达式引擎,或者根本没有。一个能够识别和忽略HTML标记的正则表达式必须解析HTML才能做到这一点,并且

但是,在应用长度验证之前,您可以使用某种预处理,例如客户端的jQuery或服务器端的其他东西来解析HTML并去除标记


不过,你确定要这样做吗?如果您将样式化的输入存储在数据库中,那么这些HTML标记将根据您的列大小计算,就像其他所有内容一样。如果要将这些标记存储在varchar(250)列中,则必须将HTML标记作为该250列的一部分进行计数,否则将其删除并丢失所有样式信息。

简短的回答是否。至少,没有任何健全的正则表达式,没有允许递归或平衡组的高级正则表达式引擎,或者根本没有。一个能够识别和忽略HTML标记的正则表达式必须解析HTML才能做到这一点,并且

但是,在应用长度验证之前,您可以使用某种预处理,例如客户端的jQuery或服务器端的其他东西来解析HTML并去除标记

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

一步完成这项工作将非常困难(几乎不可能),因为您尝试检测的语法不是上下文无关的。两步很容易;只需先做一个
s///
替换,移除所有标记,然后再次计数

另一方面,上面的正则表达式有点傻。您可以使用
字符来表示任何字符;你不必做你正在使用的“空白或不空白”的把戏

^.{0,250}$
这将很难(几乎不可能)一步完成,因为您试图检测的语法不是上下文无关的。两步很容易;只需先做一个
s///
替换,移除所有标记,然后再次计数

另一方面,上面的正则表达式有点傻。您可以使用
字符来表示任何字符;你不必做你正在使用的“空白或不空白”的把戏

^.{0,250}$

[\S\S]
技巧无疑是用来匹配
\n
字符的<代码>将不匹配换行符,除非启用多行模式。还有,这就是问题所在。上下文无关语法更复杂。可能还值得一提的是,有一些有效的HTML会破坏这个正则表达式<例如,代码>@贾斯汀:……在JavaScript中,没有多行模式,所以
[\s\s]
是“任何字符,甚至换行符”的常用成语。
[\s\s]
技巧无疑是用来匹配
\n
字符的<代码>将不匹配换行符,除非启用多行模式。还有,这就是问题所在。上下文无关语法更复杂。可能还值得一提的是,有一些有效的HTML会破坏这个正则表达式<例如,代码>@贾斯汀:……在JavaScript中,没有多行模式,所以
[\s\s]
是“任何字符,甚至换行符”的常用习惯用法。限制是使其适合具有设定高度的框。好的。在这种情况下,我建议使用jQuery或类似的工具来代替regex。这样可以正确解析HTML,甚至可以设置onkeyup事件来检查框是否已满。或者,如果你可以选择的话,你可以让这个盒子可以扩展。不管是哪种方式,使用正则表达式来做这件事的问题都是一样的。限制是它适合一个具有设定高度的盒子。好的。在这种情况下,我建议使用jQuery或类似的工具来代替regex。这样可以正确解析HTML,甚至可以设置onkeyup事件来检查框是否已满。或者,如果这是您的一个选项,您可以使该框可扩展。无论哪种方式,使用正则表达式来实现这一点的问题都是相同的。