You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel字符串验证max:15000规则不生效问题咨询

问题根因

  1. 浏览器提交textarea内容时,换行默认会被转换为\r\n(回车+换行两个字符),而大部分在线字符统计工具会将单个换行统一计为1个字符,这是手动统计值和PHP计数不一致的核心原因。你测试时总共有937行,相当于多统计了937个字符,和你给出的长度差值完全匹配。
  2. 合并内容时你拼接了两个PHP_EOL,如果运行环境为Windows,PHP_EOL本身也是\r\n,会额外增加4个字符的长度开销。

解决方案

方案1:统一换行符格式(最推荐)

验证前先把所有\r\n替换为单字符\n,再做长度校验和后续处理,保证PHP计数和手动统计结果一致:

// 先统一换行符格式
$cleanText = str_replace("\r\n", "\n", $request->input('text'));
$cleanSign = str_replace("\r\n", "\n", $request->input('sign'));
// 合并时直接用\n代替PHP_EOL,避免不同环境的换行差异
$request->merge(['text' => $cleanText . "\n\n" . $cleanSign]);

方案2:自定义验证规则

如果需要保留原始\r\n格式存储,可自定义验证规则,按照“换行计为1个字符”的逻辑统计长度:

// 注册自定义验证规则
Validator::extend('max_visible_char', function ($attribute, $value, $parameters) {
    // 替换\r\n为\n后再计数
    $calculatedLength = mb_strlen(trim(str_replace("\r\n", "\n", $value)));
    return $calculatedLength <= $parameters[0];
});

// 调整验证规则
$rules = [
    'text' => 'required|string|max_visible_char:15000'
];

方案3:调整验证阈值(不推荐)

如果不想修改业务逻辑,可根据预期最大行数上调max阈值,比如预期最多1000行内容时,可将max设为16000,抵消换行多占的字符长度。该方案兼容性差,仅适合临时调试使用。

内容的提问来源于stack exchange,提问作者Giacomo M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:24:03