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

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

$newLines = substr_count($text, "n");
$length = mb_strlen($elements['#value']) - $newLines;

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

最新更新