>我有以下来自数据库的字符串: 让我们开始运作
如果我通过 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