我必须验证在表单的文本区域字段中输入的俄语文本(utf8)。字符数(无空格、无空行)应至少为 500。文本应使用正则表达式进行检查,并且可以有很多行。
我已经尝试过:
#^.{500}.*#
这确实以某种方式造成了限制。然而,这种模式似乎不尊重 unicode。 260 个俄语字符足以通过检查。我不知道如何:
- 检查 unicode 字符
- 不计算空格
- 不计算空行
最佳答案
好的,首先 .
默认匹配字节,因为输入字符串被解释为 ASCII。使用 Unicode 模式会改变这一点(正如 Esailija 正确指出的那样),以便 .
正确匹配 (Unicode) 字符:
#^.{500}#u
您不需要尾随的 .*
,因为 PHP 中不需要匹配完整的字符串。请注意,如果前 500 个字符内有换行符,则这不匹配,因为 .
不匹配换行符(您还应该添加 s
修饰符,改变这一点)。
对于从计数中排除空格的第二个要求,您可以执行以下操作:
#^(?:\s*\S){500}#u
该子组匹配尽可能多的空格字符,然后匹配一个非空格字符。并且总共必须匹配 500 次。因此,根据需要,每个非空白字符只能获得一次重复。
请注意,不需要 s
修饰符即可在所有情况下都起作用,因为我们不使用 .
。
不过有一个警告,this article 中对此进行了解释。 , 尽管。对于 Unicode,某些字符由多个代码点组成。例如,à
可以写为一个字符 a
后跟另一个代码点(U+0300
或 `
) 是一个组合标记。因此,虽然有两个不同的 Unicode 代码点,但它们仍然只是一个字符。但是, .
匹配代码点(因为它不区分组合标记和“独立字符”)。我想这不会影响你的情况,因为西里尔字母不使用重音。但这是值得注意的事情。如果它与您相关,您可能需要研究更高级的解决方案,例如 Ωmega。
关于php - 验证 unicode 文本区域的最小长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573750/