验证unicode textarea的最小长度

时间:2012-11-26 21:49:56

标签: php regex unicode

我必须验证在表单的textarea字段中输入的俄语文本(utf8)。字符数(没有空格,没有空行)应至少为500.应使用正则表达式检查文本,并且可以有多行。

我试过了:

#^.{500}.*#

这确实以某种方式限制了这一点。但是,似乎这种模式不尊重unicode。 260个俄语字符足以通过支票。我无法弄清楚如何:

  1. 检查unicode字符
  2. 不计算空格
  3. 不计算空行

3 个答案:

答案 0 :(得分:1)

你需要u标志来激活preg_函数中的UTF-8感知:

$regex = '#^.{500}.*#u';

如果您只想查看它是否长达500个字符,您只需使用mb_strlen:

mb_internal_encoding("UTF-8");
$input_without_whitespace = preg_replace( '/[\x{0009}\x{000B}\x{000C}\x{0020}\x{00A0}\x{FEFF}\x{200C}\x{200D}]/u', "", $input );
if( mb_strlen( $input_without_whitespace ) > 500 ) {

}

答案 1 :(得分:1)

好的,首先.默认匹配字节,因为输入字符串被解释为ASCII。使用Unicode模式更改(如Esailija正确指出),以便.正确匹配(Unicode)字符:

#^.{500}#u

您不需要尾随.*,因为不需要匹配PHP中的完整字符串。请注意,如果前500个字符中存在换行符,则不匹配,因为.与换行符不匹配(您还应添加s修饰符,以更改它)。

对于从计数中排除空格的第二个要求,你可以这样做:

#^(?:\s*\S){500}#u

该子组匹配尽可能多的空格字符,然后匹配一个非空格字符。这一起必须匹配500次。因此,根据需要,每个非空白字符只能重复一次。

请注意,s修饰符不需要在所有情况下都可以使用,因为我们不使用.

但有一点需要注意,但在this article中对此进行了解释。对于Unicode,一些字符由多个代码点组成。例如,à可以写为一个字符a,后跟另一个代码点(U+0300`),这是一个组合标记。因此,虽然有两个不同的Unicode代码点,但它们仍然只有一个字符。但是,.匹配代码点(因为它不区分组合标记和“独立字符”)。我想这不会影响你的情况,因为西里尔语不使用口音。但这是值得注意的事情。如果它与您相关,您可能需要研究更高级的解决方案,如Ωmega。

答案 2 :(得分:0)

使用正则表达式

/(?>\s*+\P{M}\p{M}*){500}/u