我必须验证在表单的 textarea 字段中输入的俄语文本 (utf8)。字符数(无空格,无空行)应至少为 500。文本应使用正则表达式检查,并且可以有很多行。
我试过了:
#^.{500}.*#
这确实以某种方式限制了。但是,这种模式似乎不尊重 unicode。260 个俄语字符足以通过检查。我无法弄清楚如何:
- 检查 unicode 字符
- 不计算空格
- 不计算空行
您需要该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 ) {
}
好的,首先.
默认匹配字节,因为输入字符串被解释为 ASCII。使用 Unicode 模式会改变(正如 Esailija 正确指出的那样),以便.
正确匹配(Unicode)字符:
#^.{500}#u
您不需要尾随.*
,因为不需要匹配 PHP 中的完整字符串。请注意,如果前 500 个字符内有换行符,则这不匹配,因为.
不匹配换行符(您也应该添加s
修饰符来更改它)。
对于从计数中排除空格的第二个要求,您可以执行以下操作:
#^(?:\s*\S){500}#u
该子组匹配尽可能多的空格字符,然后匹配一个非空格字符。并且必须一起匹配 500 次。因此,根据需要,每个非空白字符只能重复一次。
请注意,在所有情况下都不需要s
修饰符,因为我们不使用.
.
不过,有一个警告,本文对此进行了解释。对于 Unicode,一些字符由多个代码点组成。例如,à
可以写为一个字符a
后跟另一个代码点(U+0300
或`
),它是一个组合标记。因此,虽然有两个不同的 Unicode 代码点,但它们仍然只有一个字符。但是,.
匹配代码点(因为它不区分组合标记和“独立字符”)。我想这不会影响您的情况,因为西里尔文不使用重音符号。但这是值得注意的。如果它与您相关,您可能想要研究更高级的解决方案,如 Ωmega 的。
使用正则表达式模式
/(?>\s*+\P{M}\p{M}*){500}/u