2

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

我试过了:

#^.{500}.*#

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

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

3 回答 3

1

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

$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 ) {

}
于 2012-11-26T22:00:55.767 回答
1

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

#^.{500}#u

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

对于从计数中排除空格的第二个要求,您可以执行以下操作:

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

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

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

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

于 2012-11-26T22:09:04.923 回答
0

使用正则表达式模式

/(?>\s*+\P{M}\p{M}*){500}/u
于 2012-11-26T22:18:28.097 回答