下面的字符串来自一个数据库:Let's Get Functional如果我通过strlen运行它,它返回25个字符,而不是预期的20个。var转储显示字符串看起来像上面的(没有html引用等)。如果去掉单引号,strlen将返回19个字符。很明显,引号返回的是5个字符而不是1个字符,为什么?我怎么才能阻止这一切谢谢!
5vf7fwbs1#
HTML实体名称为',对应于',等于5个字符,因此strlen()结果完全正确。你看不到HTML引用,因为你的浏览器正在渲染它们。打开页面源代码以查看实际的PHP输出。为了避免这个问题,您应该避免在输入上使用htmlspecialchars()函数或等效编码(因为它必须仅在HTML上下文中的输出上使用)。作为临时解决方法,您可以在strlen()之前应用html_entity_decode()。
HTML
'
'
strlen()
htmlspecialchars()
html_entity_decode()
sycxhyv72#
正如@deformhead已经解释过的,看起来你的撇号已经被转换为HTML '字符串。我的猜测是,在从数据库中获取字符串和对其调用strlen()之间,您在中间的某个地方调用htmlentities()。您还可以使用CHAR_LENGTH()(MySQL)检查在选择查询中从数据库中获得的字符数。你可能会考虑的另一个问题是,strlen()不能很好地处理多字节字符,所以如果你要处理非ASCII字符,那么你最好使用正确编码的mb_strlen()。然而,这种情况无法解释结果中5个字符的差异(strlen()计算的是字节,而不是字符串中的字符)。希望能帮上忙。
'
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
hsvhsicv4#
<?php $string = "Let's Get Functional"; echo strlen($string); ?>
此代码返回20个字符。
44u64gxh5#
我和你有同样的问题,也许这会帮助别人。单引号被转换为“'“这给了我错误的结果。简单地用单引号替换字符串就解决了我的问题。$string =“让我们变得实用”;//POST或数据库中的字符串return($string);//25$string = str_replace(“”,“”,$string); return($string);//20
5条答案
按热度按时间5vf7fwbs1#
HTML
实体名称为'
,对应于'
,等于5个字符,因此strlen()
结果完全正确。你看不到HTML引用,因为你的浏览器正在渲染它们。打开页面源代码以查看实际的PHP输出。为了避免这个问题,您应该避免在输入上使用
htmlspecialchars()
函数或等效编码(因为它必须仅在HTML上下文中的输出上使用)。作为临时解决方法,您可以在
strlen()
之前应用html_entity_decode()
。sycxhyv72#
正如@deformhead已经解释过的,看起来你的撇号已经被转换为HTML
'
字符串。我的猜测是,在从数据库中获取字符串和对其调用strlen()之间,您在中间的某个地方调用htmlentities()。您还可以使用CHAR_LENGTH()(MySQL)检查在选择查询中从数据库中获得的字符数。
你可能会考虑的另一个问题是,strlen()不能很好地处理多字节字符,所以如果你要处理非ASCII字符,那么你最好使用正确编码的mb_strlen()。然而,这种情况无法解释结果中5个字符的差异(strlen()计算的是字节,而不是字符串中的字符)。
希望能帮上忙。
wooyq4lh3#
不可能。
Look at code output here.
如何调试?
打印每个字符的ASCII码:
这就是结果:
hsvhsicv4#
此代码返回20个字符。
44u64gxh5#
我和你有同样的问题,也许这会帮助别人。
单引号被转换为“'“这给了我错误的结果。简单地用单引号替换字符串就解决了我的问题。
$string =“让我们变得实用”;//POST或数据库中的字符串
return($string);//25
$string = str_replace(“”,“”,$string); return($string);//20