PHP -HTML编码的引号导致字符串长度不正确

juud5qan  于 2023-05-16  发布在  PHP
关注(0)|答案(5)|浏览(96)

下面的字符串来自一个数据库:Let's Get Functional
如果我通过strlen运行它,它返回25个字符,而不是预期的20个。var转储显示字符串看起来像上面的(没有html引用等)。
如果去掉单引号,strlen将返回19个字符。
很明显,引号返回的是5个字符而不是1个字符,为什么?我怎么才能阻止这一切
谢谢!

5vf7fwbs

5vf7fwbs1#

HTML实体名称为',对应于',等于5个字符,因此strlen()结果完全正确。你看不到HTML引用,因为你的浏览器正在渲染它们。打开页面源代码以查看实际的PHP输出。
为了避免这个问题,您应该避免在输入上使用htmlspecialchars()函数或等效编码(因为它必须仅在HTML上下文中的输出上使用)。
作为临时解决方法,您可以在strlen()之前应用html_entity_decode()

sycxhyv7

sycxhyv72#

正如@deformhead已经解释过的,看起来你的撇号已经被转换为HTML '字符串。我的猜测是,在从数据库中获取字符串和对其调用strlen()之间,您在中间的某个地方调用htmlentities()。
您还可以使用CHAR_LENGTH()(MySQL)检查在选择查询中从数据库中获得的字符数。
你可能会考虑的另一个问题是,strlen()不能很好地处理多字节字符,所以如果你要处理非ASCII字符,那么你最好使用正确编码的mb_strlen()。然而,这种情况无法解释结果中5个字符的差异(strlen()计算的是字节,而不是字符串中的字符)。
希望能帮上忙。

wooyq4lh

wooyq4lh3#

不可能。

<?php
$str = "Let's Get Functional";
echo strlen($str), "\n"; // 20

Look at code output here.

如何调试?

打印每个字符的ASCII码:

$str = "Let's Get Functional";
$len = strlen($str);
for ($i = 0; $i < $len; $i++)
{
    echo "$i\t", ord($str[$i]), "\n";
}

这就是结果:

0   L       76
1   e       101
2   t       116
3   '       39
4   s       115
5           32
6   G       71
7   e       101
8   t       116
9           32
10  F       70
11  u       117
12  n       110
13  c       99
14  t       116
15  i       105
16  o       111
17  n       110
18  a       97
19  l       108
hsvhsicv

hsvhsicv4#

<?php

$string = "Let's Get Functional";

echo strlen($string);

?>

此代码返回20个字符。

44u64gxh

44u64gxh5#

我和你有同样的问题,也许这会帮助别人。
单引号被转换为“'“这给了我错误的结果。简单地用单引号替换字符串就解决了我的问题。
$string =“让我们变得实用”;//POST或数据库中的字符串
return($string);//25
$string = str_replace(“”,“”,$string); return($string);//20

相关问题