Подскажите пож, ранее я разделял слова в строке по символу пробела (код символа 32) и выглядело это так: Код (Text): $b=explode(" ", $nam); Массив $b содержал отдельные слова. Сейчас я столкнулся со строкой, которая разделяет слова неразрывным пробелом (код 160). Он выглядит как обычный пробел, но мой код теперь его не находит. Пробовал искать символ таким кодом: Код (Text): $b=explode(chr(160), $nam); Но это не работает.. Как разделить строку по символу неразрывного пробела?
Я не знаю контекста, но возможно там неслучайно неразрывный пробел и разрывать по нему не надо. Если всё-таки хочется, то надо выяснить какой именно символ там. Если мы имеем дело с html, то возможно там не один символ, а мнемоническое обозначение А может быть там какой-то уникодный мультибайтный символ. В Общем надо сделать дамп строки и посмотреть что за символ. bin2hex() в помощь.
Строку я читаю из текстового файла (там записаны имена спортсменов, например, "PATIL Rudrankksh" и нужно добавить запятую между именем и фамилий "PATIL, Rudrankksh"), полученного путем сохранения таблицы Excel (текстовый файл с разделителями табуляций). Менять алгоритм не нужно, т.к. там много нюансов. Ранее Excel в такой формат сохранял пробелы с кодом 32 между словами, в новых версиях Excel сохраняет код пробела 160. Т.е. это не html пробел Все верно, мне нужно выяснить, какой символ записать в метод explode, чтобы разделить строку по этому пробелу 160. Я добавил bin2hex(), но не очень понимаю как это использовать? Вот упрощенный код моей задачи: Код (Text): $nam = "PATIL Rudrankksh"; //пробел 160 $nam1 = "PATIL Rudrankksh"; //пробел 32 $b=explode(' ', $nam); $b1=explode(' ', $nam1); echo $b[0]."<br>"; // PATIL Rudrankksh (не разделяется, когда пробел 160) echo $b[1]."<br>"; // echo $b1[0]."<br>"; // PATIL (хорошо разделяется по обычному пробелу 32) echo $b1[1]."<br>"; // Rudrankksh echo "<br>"; $hex = bin2hex($nam); var_dump($hex); // string(34) "504154494cc2a052756472616e6b6b7368" echo "<br>"; $hex1 = bin2hex($nam1); var_dump($hex1); // string(32) "504154494c2052756472616e6b6b7368"
всё в документации. пользуйся: https://www.php.net/bin2hex я, например, разделил дамп на двойки и склеил назад. вывел рядом с исходной строкой (которую получил как $s=hex2bin("504154494c2052756472616e6b6b7368") и $s=hex2bin("504154494cc2a052756472616e6b6b7368") ) Код (Text): echo implode(',', str_split(bin2hex($s), 2)) . "\n" . implode(', ', str_split($s)); // 50,41,54,49,4c,20,52,75,64,72,61,6e,6b,6b,73,68\n // P, A, T, I, L, , R, u, d, r, a, n, k, k, s, h // 50,41,54,49,4c,c2,a0,52,75,64,72,61,6e,6b,6b,73,68\n // P, A, T, I, L, Â, , R, u, d, r, a, n, k, k, s, h Там двухбайтовый (UTF-8) код 0xc2a0 --- Добавлено --- Stackoverflow решает все проблемы https://stackoverflow.com/q/12837682/272885 замени этот символ на пробел, а дальше как обычно - через explode(' ', $s)
Извлеките необходимое с помощью, например substr() Либо же, если я правильно понял задачу, используйте preg_split() вместо explode() Код (Text): $array = preg_split('/\s/', $str);
Спасибо! На самом деле кодировка ANSI там (т.к. читаю фамилию из файла). UTF - 8 Она стала после копирования фамилии в код php. Дамп фамилии в ANSI такой: Код (Text): 50,41,54,49,4c,a0,52,75,64,72,61,6e,6b,6b,73,68, P, A, T, I, L, , R, u, d, r, a, n, k, k, s, h Код пробела в ANSI - 'a0' Такой код не работает теперь: Код (Text): $str=preg_replace('~\xc2\xa0~', ' ', $str); (для UTF-8 это работает! можно конечно перековертить ANSI в UTF, но это лишняя операция) Пробовал Код (Text): $str=preg_replace('~\xa0~', ' ', $str); Это не работает, видно для ANSI свой синтаксис...
Прошу прощения, на самом деле все работает с таким синтаксисом, невнимательно проверил. Код (Text): $str=preg_replace('~\xa0~', ' ', $str); Спасибо большое всем за помощь!