首页 > 解决方案 > mb_strlen() 计算新行两次 - 与 JavaScript 中的 .length() 不同

问题描述

我遇到了这个问题,因为我们尝试通过 JavaScript 计算 textarea 字段中的字符并使用 PHP 验证字符数。当文本区域中的文本用换行符填充时,就会出现问题。

对于 JavaScript 中的计数,我们使用不更改输入文本(例如删除空格):

input.val().length

在 PHP 中,我们使用 mb_strlen() 进行计数,并通过设置编码和不设置编码对其进行了测试:

$length = mb_strlen($elements['#value'], 'UTF-8');
$length2 = mb_strlen($elements['#value']);

示例文本:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo.

此文本导致 JavaScript 和 PHP 中的字符数均为 424。

当我输入新行时(之前Donec quam felis,

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo.

JavaScript 中的字符数为 425,PHP 中为 426。我的目标是在 PHP 中获得与我相同的计数,并且用户不应将新行计算两次。

标签: javascriptphpmbstring

解决方案


我认为 PHP 将换行符计为\n. 简单的方法是计算字符串中出现的次数并从长度中减去 if:

$newLines = substr_count($text, "\n");

$length = mb_strlen($elements['#value']) - $newLines;

推荐阅读