首页 > 解决方案 > 字符串验证最多 15000 个字符不起作用

问题描述

我正在尝试使用最多 15000 个字符的验证规则来验证 textarea。

这是我创建的规则:

array:1 [▼
    "text" => "required|string|max:15000"
]

在我以这种方式连接两个输入之前的某个地方:

$request->merge(['text' => $request->input('text') . PHP_EOL . PHP_EOL . $request->input('sign']);

即使文本输入和符号输入的总和(根据本网站)为 14988 ,代码也未通过验证。
为了计算它,我只是将 textarea 值传递给网站并检查了字符数。

更新
如果我记录输入的长度$request->text(即使日志中写入的 SAME 字符串是 15000),我会得到这些值:

strlen(trim($request->text)) => 15937
mb_strlen(trim($request->text)) => 15937

我猜它与\r、\n 或\r\n 相关。

第二次更新
我从随机字符串网站创建了字符串,我注意到字符串是 937 行,这比字符串应该是多出的确切数字。
似乎 PHP 将每个换行符计数两次。

标签: phpvalidationlaravel-5laravel-validation

解决方案


我建议您在尝试验证之前自己进行字符串操作,将换行符替换PHP_EOL为内置的 PHP 换行符,以处理 dos 和 Linux 换行符带来的复杂性。

当您从网络复制粘贴时,大部分时间<br>标签都会转换为 \r\n ,它被识别为两个字符。大多数 Windows 文本编辑器也输出相同的 \r\n 换行符。这就是为什么双重计数。

您可以使用正则表达式或内置str_replace("\r\n",PHP_EOL,$my_text)来替换换行符。

您可以将 \r\n 替换为 \n 将用于您的字符计数目的,但会根据您的应用程序不准确地显示新行。


推荐阅读