За последние 24 часа нас посетили 22714 программистов и 1277 роботов. Сейчас ищут 777 программистов ...

explode и неразрывный пробел

Тема в разделе "PHP для новичков", создана пользователем multidem, 5 дек 2022.

  1. multidem

    multidem Новичок

    С нами с:
    4 дек 2022
    Сообщения:
    5
    Симпатии:
    0
    Подскажите пож, ранее я разделял слова в строке по символу пробела (код символа 32) и выглядело это так:

    Код (Text):
    1. $b=explode(" ", $nam);
    Массив $b содержал отдельные слова.

    Сейчас я столкнулся со строкой, которая разделяет слова неразрывным пробелом (код 160). Он выглядит как обычный пробел, но мой код теперь его не находит.

    Пробовал искать символ таким кодом:

    Код (Text):
    1. $b=explode(chr(160), $nam);
    Но это не работает.. Как разделить строку по символу неразрывного пробела?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Я не знаю контекста, но возможно там неслучайно неразрывный пробел и разрывать по нему не надо.

    Если всё-таки хочется, то надо выяснить какой именно символ там. Если мы имеем дело с html, то возможно там не один символ, а мнемоническое обозначение  
    А может быть там какой-то уникодный мультибайтный символ. В Общем надо сделать дамп строки и посмотреть что за символ. bin2hex() в помощь.
     
    #2 artoodetoo, 5 дек 2022
    Последнее редактирование: 5 дек 2022
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
      (non-breaking, no-break).
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
  5. multidem

    multidem Новичок

    С нами с:
    4 дек 2022
    Сообщения:
    5
    Симпатии:
    0
    Строку я читаю из текстового файла (там записаны имена спортсменов, например, "PATIL Rudrankksh" и нужно добавить запятую между именем и фамилий "PATIL, Rudrankksh"), полученного путем сохранения таблицы Excel (текстовый файл с разделителями табуляций). Менять алгоритм не нужно, т.к. там много нюансов. Ранее Excel в такой формат сохранял пробелы с кодом 32 между словами, в новых версиях Excel сохраняет код пробела 160. Т.е. это не html пробел  
    Все верно, мне нужно выяснить, какой символ записать в метод explode, чтобы разделить строку по этому пробелу 160. Я добавил bin2hex(), но не очень понимаю как это использовать? Вот упрощенный код моей задачи:

    Код (Text):
    1. $nam = "PATIL Rudrankksh"; //пробел 160
    2. $nam1 = "PATIL Rudrankksh"; //пробел 32
    3.  
    4.     $b=explode(' ', $nam);
    5.     $b1=explode(' ', $nam1);
    6.  
    7. echo $b[0]."<br>"; // PATIL Rudrankksh (не разделяется, когда пробел 160)
    8. echo $b[1]."<br>"; //
    9.  
    10. echo $b1[0]."<br>"; // PATIL (хорошо разделяется по обычному пробелу 32)
    11. echo $b1[1]."<br>"; // Rudrankksh
    12.  
    13. echo "<br>";
    14. $hex = bin2hex($nam);
    15. var_dump($hex); // string(34) "504154494cc2a052756472616e6b6b7368"
    16.  
    17. echo "<br>";
    18. $hex1 = bin2hex($nam1);
    19. var_dump($hex1); // string(32) "504154494c2052756472616e6b6b7368"
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    всё в документации. пользуйся: https://www.php.net/bin2hex

    я, например, разделил дамп на двойки и склеил назад. вывел рядом с исходной строкой (которую получил как
    $s=hex2bin("504154494c2052756472616e6b6b7368") и
    $s=hex2bin("504154494cc2a052756472616e6b6b7368") )

    Код (Text):
    1.  
    2. echo implode(',', str_split(bin2hex($s), 2)) . "\n" . implode(', ', str_split($s));
    3.  
    4. //  50,41,54,49,4c,20,52,75,64,72,61,6e,6b,6b,73,68\n
    5. //  P, A, T, I, L,  , R, u, d, r, a, n, k, k, s, h
    6.  
    7. //  50,41,54,49,4c,c2,a0,52,75,64,72,61,6e,6b,6b,73,68\n
    8. //  P, A, T, I, L, Â,  , R, u, d, r, a, n, k, k, s, h
    Там двухбайтовый (UTF-8) код 0xc2a0
    --- Добавлено ---
    Stackoverflow решает все проблемы :D
    https://stackoverflow.com/q/12837682/272885

    замени этот символ на пробел, а дальше как обычно - через explode(' ', $s)
     
    multidem нравится это.
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Извлеките необходимое с помощью, например substr()
    Либо же, если я правильно понял задачу, используйте preg_split() вместо explode()
    Код (Text):
    1.  
    2. $array = preg_split('/\s/', $str);
     
  8. multidem

    multidem Новичок

    С нами с:
    4 дек 2022
    Сообщения:
    5
    Симпатии:
    0
    Спасибо! На самом деле кодировка ANSI там (т.к. читаю фамилию из файла). UTF - 8 Она стала после копирования фамилии в код php.
    Дамп фамилии в ANSI такой:

    Код (Text):
    1. 50,41,54,49,4c,a0,52,75,64,72,61,6e,6b,6b,73,68,
    2. P, A, T, I, L, , R, u, d, r, a, n, k, k, s, h
    Код пробела в ANSI - 'a0'

    Такой код не работает теперь:

    Код (Text):
    1. $str=preg_replace('~\xc2\xa0~', ' ', $str);
    (для UTF-8 это работает! можно конечно перековертить ANSI в UTF, но это лишняя операция)

    Пробовал

    Код (Text):
    1. $str=preg_replace('~\xa0~', ' ', $str);
    Это не работает, видно для ANSI свой синтаксис...
     
  9. multidem

    multidem Новичок

    С нами с:
    4 дек 2022
    Сообщения:
    5
    Симпатии:
    0
    Попробовал, не работает...
     
  10. multidem

    multidem Новичок

    С нами с:
    4 дек 2022
    Сообщения:
    5
    Симпатии:
    0
    Прошу прощения, на самом деле все работает с таким синтаксисом, невнимательно проверил.
    Код (Text):
    1. $str=preg_replace('~\xa0~', ' ', $str);
    Спасибо большое всем за помощь!