Поддержка Проблемы и решения Сравнение строк

  • Здравствуйте.
    Я проверял двумя способами:
    1) Через оператор «===»:

    $isCheck = "FALSE";
    if ($colTitle === 'артикул') {
      $isCheck = "TRUE";
    }

    2) Через оператор «strcasecmp»:

    $isCheck = "FALSE";
    if (strcasecmp($colTitle, 'артикул') == 0) {
      $isCheck = "TRUE";
    }

    В обоих случаях я логировал значение переменной $colTitle и смотрел результат, он был одинаковый:
    [colTitle: артикул; isCheck: FALSE]

    Самое забавное, что с другими строками такой проблемы не было.

    • Тема изменена 4 года, 7 месяцев назад пользователем rofl113.
Просмотр 14 ответов — с 1 по 14 (всего 14)
  • Модератор Yuri

    (@yube)

    Здравствуйте. Спасибо за информацию.

    Сделал логирование символов, вот такого кода:

    $isCheckSky = "FALSE";
     $textFind = 'артикул';
    if (strcasecmp($colTitle, $textFind) == 0) {
      $isCheckSky = "TRUE";
    }
    $productCsv->dump .= 'colTitle: ' . $colTitle . '; Code: ' . implode(", ", unpack('C*', $colTitle)) . '<br />';
    $productCsv->dump .= 'textFind: ' . $textFind . '; Code: ' . implode(", ", unpack('C*', $textFind)) . '<br />';

    Вывод:

    colTitle: артикул; Code: 239, 187, 191, 208, 176, 209, 128, 209, 130, 208, 184, 208, 186, 209, 131, 208, 187
    textFind: артикул; Code: 208, 176, 209, 128, 209, 130, 208, 184, 208, 186, 209, 131, 208, 187

    Как такое может быть?)

    • Ответ изменён 4 года, 7 месяцев назад пользователем rofl113.
    
    $colTitle = 'артикул';                
    $isCheck = false;
    if ($colTitle == 'артикул') {
      $isCheck = true;
    }
    var_dump($isCheck);
    

    результат:

    
    bool(true)
    

    Добавил проверку кодировки, но у них все ровно у каждого UTF-8.
    Видимо в начале какие то скрытые символы (отличие только вначале в этом: 239, 187, 191)
    Решил вопрос через «strpos».

    • Ответ изменён 4 года, 7 месяцев назад пользователем rofl113.

    ($colTitle == ‘артикул’)

    Если я не ошибаюсь то так не сравнивают строки.
    А еще проблема в том что одну строку я сам создаю на месте, а вторую я получаю по ссылке в csv файле.
    У вас локально (скорее всего) никогда такой проблемы не будет.

    почему не сравнивают то?
    почитайте — https://www.php.net/manual/ru/language.operators.comparison.php

    почитайте

    Спасибо за информацию.
    Проблема оказалась в том что по ссылке в начале какие то скрытые символы, пришлось искать по подстроке.

    Модератор Yuri

    (@yube)

    239, 187, 191 — это же BOM

    А от них можно как «автоматически» избавиться?
    Или только в ручную удалять?

    
    function removeBomUtf8($s){
      if(substr($s,0,3)==chr(hexdec('EF')).chr(hexdec('BB')).chr(hexdec('BF'))){
           return substr($s,3);
       }else{
           return $s;
       }
    }
    

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

    Модератор Yuri

    (@yube)

    А от них можно как «автоматически» избавиться?

    Можно. Но интересно, откуда он взялся?

    Можно. Но интересно, откуда он взялся?

    так ТС получает csv по ссылке — кто-то на той стороне сохраняет файл csv с БОМ.

    Модератор Yuri

    (@yube)

    кто-то на той стороне сохраняет файл csv с БОМ.

    артикул — первое слово в первой строке? Ну, может быть. Есть любители поБОМить.

    Кстати, я тут намедни бодался с ошибкой json_decode с json-ответом от API 1С. Пока hex dump не посмотрел, никак не мог понять, чем декодеру не нравится вполне пристойный на вид json.

Просмотр 14 ответов — с 1 по 14 (всего 14)
  • Тема «Сравнение строк» закрыта для новых ответов.