Сравнение строк 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 и т. Д. Строки, Которые они не будут сравнивать или изменять тип.
Спасибо за вашу помощь!
Питер.
6 answers
Обрежьте строки перед сравнением, есть экранированные символы, такие как \t и \n, которые не видны.
$clean_str = trim($str);
Буква "а" может быть написана в другой кодировке.
Например: 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-с
- %74- t
- %0d - \r (возврат каретки)
- %0a - \п (перевод строки)
Или, как указано в комментариях @Karolis, вы можете использовать встроенную функцию bin2hex()
:
echo bin2hex("test\r\n");
Вывод:
746573740d0a
Вы уже пытались обрезать эти строки?
if (trim($string1) == trim($string2)) {
// do things
}
Пожалуйста, попробуйте http://php.net/manual/en/function.strcmp.php для сравнения строк.
Вероятно, строки Юникода в верхнем диапазоне считаются двойными байтами.
Используйте mb_strlen
для проверки длины.
Также некоторые символы могут быть невидимыми, но присутствовать (есть много пробелов в юникоде и т.д.)
Как правило, при работе с функциями Юникода следует использовать строковые функции mb_*
.
Вы можете перегрузить функции кодирования строк в php.ini
, чтобы всегда использовать функции mb_*
вместо стандартных (не уверен, что xdebug
соблюдает их настройки).
В PHP 6 эта проблема будет решена, так как она должна быть глобально ориентирована на Юникод.