mb_strlen() 计算新行两次 - 与 JavaScript 中的 .length() 不同

mb_strlen() counts new lines twice - difference to .length() in JavaScript

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

为了在 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 中获得与我和用户相同的计数,换行不应该被计算两次。

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

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

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

发布的表单数据中的换行符表示为 \r\n(算作两个字符),而不是浏览器的 input.value 表示中的 \n。在服务器端验证之前,您可以用 str_replace() 替换另一个。