我必须验证在表单的textarea字段中输入的俄语文本(utf8)。字符数(没有空格,没有空行)应至少为500.应使用正则表达式检查文本,并且可以有多行。
我试过了:
#^.{500}.*#
这确实以某种方式限制了这一点。但是,似乎这种模式不尊重unicode。 260个俄语字符足以通过支票。我无法弄清楚如何:
答案 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