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

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

12 голосов
/ 12 июля 2011

У меня есть две строки, которые выглядят одинаково, когда я повторяю их, но когда я 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 ]

9 голосов
/ 12 июля 2011

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

7 голосов
/ 12 июля 2011

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

$clean_str = trim($str);

6 голосов
/ 12 июля 2011

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

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

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

Выход:

746573740d0a
3 голосов
/ 12 июля 2011

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

if (trim($string1) == trim($string2)) {
 // do things
}
1 голос
/ 12 июля 2011

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

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

Также некоторые символы могут быть не видны, но присутствуют (их многопробелы Unicode и т.* функционирует вместо стандартных (не уверен, что xdebug соблюдает эти настройки).

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

1 голос
/ 12 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...