PHP字符串比较

paj*_*paj 12 php string comparison types

当我回显它时,我有两个看起来相同的字符串,但是当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
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助!

彼得.

OZ_*_*OZ_ 9

字母"a"可以用另一种编码写入.
例如:bl?h- 这a是一个西里尔字母''.
所有这些字母都是西里尔字母,但看起来像拉丁语:у,е,х,а,р,о,с


Phe*_*nix 7

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

$clean_str = trim($str);


bin*_*yLV 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", '%');
Run Code Online (Sandbox Code Playgroud)

输出:

%74%65%73%74%0d%0a
Run Code Online (Sandbox Code Playgroud)

这解码为:

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

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

echo bin2hex("test\r\n");
Run Code Online (Sandbox Code Playgroud)

输出:

746573740d0a
Run Code Online (Sandbox Code Playgroud)

  • 实际上有`bin2hex()`函数,但建议很好. (2认同)