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


PHP - incorrect string length caused by HTML-encoded quote

>我有以下来自数据库的字符串: 让我们开始运作

如果我通过 strlen 运行它,它会返回 25 个字符而不是预期的 20 个字符。var 转储显示字符串看起来像上面(没有 html 引用等)。

如果我删除单引号strlen返回19个字符。

显然,报价返回 5 个字符而不是 1 个字符 - 为什么?我怎样才能阻止这种情况?

谢谢!

HTML实体名称对于 ' ',等于 5 个字符,因此您的strlen()结果完全正确。您看不到 HTML 引用,因为您的浏览器正在呈现它们。打开页面源代码以查看实际的 PHP 输出。

为避免此问题,您应该避免在输入上使用htmlspecialchars()函数或等效编码(因为它必须仅用于 HTML 上下文中的输出)。

作为临时解决方法,您可以在strlen()之前应用html_entity_decode()

正如@deformhead已经解释的那样,您的撇号似乎已转换为 HTML '字符串。我的猜测是,在从数据库中获取字符串和在其上调用 strlen() 之间,您调用介于两者之间的 htmlentities()。

您还可以使用 CHAR_LENGTH() (MySQL) 检查从选择查询中的数据库中获取的字符数。

您可能会考虑的另一个问题是 strlen() 不适用于多字节字符,因此如果您要使用非 ASCII 字符,那么最好使用具有正确编码的 mb_strlen()。但是,这种情况无法解释结果中 5 个字符的差异(strlen() 计算字节而不是字符串中的字符)。

希望有帮助。

不可能。

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

在此处查看代码输出。

如何调试?

打印每个字符的 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
<?php
$string = "Let's Get Functional";
echo strlen($string);
?>

此代码返回 20 个字符。

我和你有同样的问题,也许这会帮助某人。

单引号被转换为"'",这给了我不正确的结果。简单地用单引号替换字符串就解决了我的问题。

$string = "Let's Get Functional";//来自 POST 或数据库的字符串

echo strlen($string);//25

$string = str_replace("'", "'",$string);回声斯特伦($string);20