PHP字符串比较

时间:2011-07-12 11:18:38

标签: php string types comparison

当我回显它时,我有两个看起来相同的字符串,但当我var_dump()时,它们是不同的字符串类型:

Echo:
http://blah
http://blah
var dump:
string(14) "http://blah"
string(11) "http://blah"
strToHex:
%68%74%74%70%3a%2f%2f%62%6c%61%68%00%00%00
%68%74%74%70%3a%2f%2f%62%6c%61%68

当我比较它们时,它们会返回false。如何操作字符串类型以便我可以执行返回true的比较。字符串11和字符串14有什么区别?我确信有一个简单的解决方案,但还没有找到任何东西,无论我如何内爆,爆炸,UTF8编码等他们不会比较或更改类型的字符串。

感谢您的帮助!

彼得。

6 个答案:

答案 0 :(得分:9)

字母“a”可以用其他编码书写 例如:blаh - 此处a是一个西里尔字母''' 所有这些字母都是西里尔字母,但看起来像拉丁语:у,е,х,а,р,о,с

答案 1 :(得分:7)

在比较之前修剪字符串,有不可见的Escaped字符,如\ t和\ n。

$clean_str = trim($str);

答案 2 :(得分:6)

使用var_dump()时,string(14)表示值为string且保留14个字节。因此string(11)string(14)不是字符串的“类型”,它们只是不同长度的字符串。

我会使用这样的东西来查看这些字符串中的实际内容:

function strToHex($value, $prefix = '') {
    $result = '';
    $length = strlen($value);
    for ( $n = 0; $n < $length; $n++ ) {
        $result .= $prefix . sprintf('%02x', ord($value[$n]));
    }
    return $result;
}

echo strToHex("test\r\n", '%');

输出:

%74%65%73%74%0d%0a

这解码为:

  • %74 - t
  • %65 - e
  • %73 - s
  • %74 - t
  • %0d - \ r(回车)
  • %0a - \ n(换行)

或者,正如@Karolis的评论所指出的,你可以使用内置函数bin2hex()

echo bin2hex("test\r\n");

输出:

746573740d0a

答案 3 :(得分:3)

您是否已尝试trim这些字符串?

if (trim($string1) == trim($string2)) {
 // do things
}

答案 4 :(得分:1)

请尝试http://php.net/manual/en/function.strcmp.php进行字符串比较。

答案 5 :(得分:1)

可能在较高范围内的Unicode字符串被计为双字节。

使用mb_strlen检查长度。

也有些字符可能不可见,但存在(有许多unicode空格等)。

通常,在使用Unicode函数时,应使用mb_*字符串函数。

您可以在php.ini中重载字符串编码函数,以便始终使用mb_*函数而不是标准函数(不确定xdebug是否遵循这些设置)。

在PHP 6中,这个问题将得到解决,因为它应该是全局的Unicode识别。