Сравнение строк PHP

у меня есть две строки, которые выглядят одинаково, когда я эхо их, но когда я var_dump() them они разные типы строк:

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 ответов


обрезать строки перед сравнением, есть экранированные символы, такие как \t и \n, которые не видны.

$clean_str = trim($str);


буква " a " может быть записана в другой кодировке.
Например: blаh здесь a это кириллица 'а'.
Все эти буквы кириллицы, но похоже на латынь: у, е, х, а, р, о, с


при использовании 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 - Т
  • %0d - \r (возврат каретки)
  • %0a - \n (линия подачи)

или, как указано в комментариях @Karolis, вы можете использовать встроенную функцию bin2hex():

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

выход:

746573740d0a

вы уже пытались отделка эти строки?

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

пожалуйста, попробуйте http://php.net/manual/en/function.strcmp.php Для сравнения строк.


вероятно, строки Unicode в верхнем диапазоне считаются двойными байтами.

использовать mb_strlen для проверки длины.

также некоторые символы могут быть не видны, но присутствуют (есть много пробелов unicode и т. д.)

как правило, при работе с функциями Unicode следует использовать mb_* строковые функции.

вы можете перегрузить функции кодирования строк в php.ini всегда использовать mb_* функции вместо стандартных (не уверен, что xdebug чтит эти настройки).

в PHP 6 эта проблема будет решена, так как она должна быть глобально известна Unicode.