Сделайте унификацию кодировки перед сравнением строк в PHP - PullRequest
3 голосов
/ 14 октября 2009

Я работаю над функцией, которая требует от меня получить содержимое веб-страницы, а затем проверить, присутствует ли на этой странице определенный текст. Это инструмент проверки обратных ссылок.

Проблема в том, что функция работает идеально большую часть времени, но иногда она помечает страницу как не имеющую ссылку, когда ссылка явно есть. Я проследил это до момента визуального сравнения строк в выводе, и они отлично совпадают, но с помощью оператора == php сообщает мне, что они не совпадают.

Признавая, что это, вероятно, какая-то проблема кодирования, я решил посмотреть, что произойдет, если я буду использовать base64_encode () для них, чтобы я мог видеть, если это дает разные результаты между двумя строками (которые выглядят точно то же самое).

Мои подозрения подтвердились - использование base64_encode для сравниваемых строк давало разные строки для каждого. Проблема найдена! Проблема в том, что я понятия не имею, как ее решить.

Есть ли какой-нибудь способ, которым я могу сделать эти строки единообразными на основе выводимого текста (который соответствует), чтобы при сравнении их в php они совпадали?

Ответы [ 6 ]

2 голосов
/ 14 октября 2009

Я не совсем продан из-за твоей веры в то, что это кодировка. PHP собирается хранить все свои строки в одном и том же формате. Не могли бы вы попробовать этот код? Он сравнивает значение ascii каждого символа в обеих строках, что может выявить то, что вы не видите, визуально сравнивая строки.

$str1 = ...;
$str2 = ...;

if(strlen($str1) != strlen($str2)) {
  echo "Lengths are different!";
} else {
  for($i=0; $i < strlen($str1); $i++) {
    if(ord($str1[$i]) != ord($str2[$i]) {
      echo "Character $i is different! str1: " . ord($str1[$i]) . ", str2: " . ord($str2[$i]);
      break;
    }
  }
}
1 голос
/ 14 октября 2009

Без кода приложения трудно сказать, что происходит.

Попробуйте использовать trim () для строк, чтобы удалить конечный пробел, который невидим невооруженным глазом.

Вы можете обнаружить, что strcmp также дает лучшие результаты.

0 голосов
/ 14 октября 2009

Если вы не можете надежно получить кодировку, вы можете использовать mb_convert_encoding.

$string1 = mb_convert_encoding($string1, 'utf-8', 'auto');
$string2 = mb_convert_encoding($string2, 'utf-8', 'auto');

Если вы можете определить кодировку (из заголовков http или мета-тегов), вы должны указать кодировку вместо использования "auto".

$string1 = mb_convert_encoding($string1, 'utf-8', $encoding1);
$string2 = mb_convert_encoding($string2, 'utf-8', $encoding2);
0 голосов
/ 14 октября 2009

Вы можете попробовать использовать расширение Dom для PHP. При создании нового Dom Document вы можете указать кодировку базового документа / веб-страницы. Согласно на этом сайте , внутри все сделано в UTF-8. Затем вы можете найти интересующие вас dom-узлы и сравнить текстовое содержимое узла

Если вы не используете веб-страницы со связанной указанной кодировкой символов, я бы предложил использовать многобайтовые функции, в частности mb_detect_encoding и mb_convert_encoding

0 голосов
/ 14 октября 2009

Попробуйте mb_strstr () и trim () , как указано dcaunt.

0 голосов
/ 14 октября 2009

как насчет запуска обоих через санирующий фильтр (если у вас php> 5.2.0). Я не знаю, что он будет делать, но может.

http://www.phpro.org/tutorials/Filtering-Data-with-PHP.html#12

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