php - 验证 unicode 文本区域的最小长度

标签 php regex unicode

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

我已经尝试过:

#^.{500}.*#

这确实以某种方式造成了限制。然而,这种模式似乎不尊重 unicode。 260 个俄语字符足以通过检查。我不知道如何:

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

最佳答案

好的,首先 . 默认匹配字节,因为输入字符串被解释为 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/

相关文章:

php - 如何将超过100000条记录导入mysql数据库?

php - 异常代码的严重性

c# - 使用正则表达式将 double 替换为 float

php - 在前面插入空格的正则表达式\n

c - __STDC_ISO_10646__ 的可能值

php - utf8编码mysql查询不起作用

php - 使用计数器更新 codeigniter 事件记录

javascript - Bookmarklet - 从 URL 获取 ID 并将其放入剪贴板

python - 为什么此 Python 3 代码无法使用 str.translate() 删除 Unicode 重音字符?

c# - 如何在C#中标准化外观精美的unicode字符串?