Сравнение строк 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.