Подтвердить что ты не робот

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

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

Петр.

4b9b3361

Ответ 1

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

$clean_str = trim($str);

Ответ 2

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

Ответ 3

При использовании 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

Ответ 4

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

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

Ответ 6

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

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

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

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

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

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