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


У меня есть две строки, которые выглядят одинаково, когда я повторяю их, но когда я 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 и т. Д. Строки, Которые они не будут сравнивать или изменять тип.

Спасибо за вашу помощь!

Питер.

Author: paj, 2011-07-12

6 answers

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

$clean_str = trim($str);

 7
Author: Pheonix, 2011-07-12 11:31:20

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

 9
Author: OZ_, 2011-07-12 11:23:41

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

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

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

Вывод:

746573740d0a
 6
Author: binaryLV, 2011-07-12 12:21:56

Вы уже пытались обрезать эти строки?

if (trim($string1) == trim($string2)) {
 // do things
}
 3
Author: VAShhh, 2011-07-12 11:20:58

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

 1
Author: madflow, 2011-07-12 11:24:08

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

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

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

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

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

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

 1
Author: takeshin, 2011-07-12 11:32:33