Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Парсинг xls с преобразованием русских символов функцией preg_replace()

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: При обработке русских слов функцией preg_replace() на выходе получаю набор цифр
sheff2000
Отправлено: 20 Июня, 2012 - 15:04:29
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




Входные данные:
- Есть XLS файлы с русскими и английскими словами.
- Парсинг идет скриптом Excel Parser Pro.
- Обрабатывается все построчно.
- Значения ячеек в строке заносятся в соответствующие переменные.
- Кодировка полученных значений - ASCII
- Далее над содержимым переменных выполняется преобразование вида:


Суть проблемы:
в результате преобразований получаем следующее
    начальное значение - П-40/1100Э
    после преобразований получаю - 105545524847494948481069
    ожидаемый результат - п401100э

с значениями переменных на английском языке проблем нет.

Уже перечитал, пересмотрел горы статей и справочников, чувствую что ответ рядом но докопаться до него не могу.
Подскажите в чем может быть проблема и как правильно надо работать с кириллическими символами в таком вот случаи?
 
 Top
Мелкий Супермодератор
Отправлено: 20 Июня, 2012 - 15:12:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




0) в ASCII кириллицы не существует. Уточните кодировку
1) mb_internal_encoding, возможно, неверно указана


-----
PostgreSQL DBA
 
 Top
sheff2000
Отправлено: 20 Июня, 2012 - 15:31:18
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




Мелкий пишет:
0) в ASCII кириллицы не существует. Уточните кодировку


тоже удивлен, но вот проверяю кодировку функцией:
PHP:
скопировать код в буфер обмена
  1. echo mb_detect_encoding ($valuetext);
  2. # на экране получаю - ASCII



Мелкий пишет:

1) mb_internal_encoding, возможно, неверно указана

действительно, показывает - ISO-8859-1
поставил в начале крипта строку mb_internal_encoding("UTF-8"); - ничего не изменилось, кодировку обрабатываемых слов все также пишем как ASCII, все те же цифры в результатах Недовольство, огорчение
 
 Top
fdr21
Отправлено: 20 Июня, 2012 - 15:49:20
Post Id



Гость


Покинул форум
Сообщений всего: 86
Дата рег-ции: Июнь 2012  


Помог: 5 раз(а)




Попробуйте для начало преобразовать символы:

PHP:
скопировать код в буфер обмена
  1. $valuetext = mb_convert_encoding($valuetext, "UTF-8", mb_detect_encoding ($valuetext));
  2. preg_replace("/[^A-ZА-ЯЁ0-9]+/ui", '', mb_strtolower($valuetext));

желательно что бы скрипт тоже был написан на UTF-8
 
 Top
sheff2000
Отправлено: 20 Июня, 2012 - 16:03:14
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




fdr21 пишет:
Попробуйте для начало преобразовать символы:

желательно что бы скрипт тоже был написан на UTF-8


все файлы скриптов в UTF-8

пробовал преобразовывать - в результате получаю вообще пустое значение, для латиницы все нормально.

какойто Недовольство, огорчение полтергейст. и такая проблема только при обработке xls, xml (utf-8) и просто выборка из базы данных с таким же механизмом обработки строк работает отлично с любыми символами.

UPD. проверил "пустое" значение функцией mb_strlen() - есть значения

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $valuetext = 'П-40/1100Э'; #полученое из XLS, на экран выводится все правильно
  3. $valuetext = mb_convert_encoding($valuetext, "UTF-8", mb_detect_encoding ($valuetext));
  4. $rezult = preg_replace("/[^A-ZА-ЯЁ0-9]+/ui", '', mb_strtolower($valuetext));
  5.  
  6. echo 'Резльтат - '.$rezult.'|'.mb_strlen($rezult);
  7. # получаю вот такую строку:
  8. # Результат -|54
  9. ?>

(Отредактировано автором: 20 Июня, 2012 - 16:04:10)

 
 Top
Мелкий Супермодератор
Отправлено: 20 Июня, 2012 - 16:40:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




sheff2000 пишет:
но вот проверяю кодировку функцией:

Может безбожно врать. Или, как в вашем случае, определять не всё. ASCII ведь полностью входит в UTF8 (и ещё большую кучу кодировок).

Попробуйте в порядке эксперимента
PHP:
скопировать код в буфер обмена
  1. $valuetext = mb_strtolower(preg_replace("/[^A-ZА-ЯЁ0-9]+/ui", '', $valuetext));

Всё равно у меня подозрения, что mb_strtolower портит строку.


-----
PostgreSQL DBA
 
 Top
fdr21
Отправлено: 20 Июня, 2012 - 16:53:45
Post Id



Гость


Покинул форум
Сообщений всего: 86
Дата рег-ции: Июнь 2012  


Помог: 5 раз(а)




вроде бы так работает
PHP:
скопировать код в буфер обмена
  1. $valuetext = 'П-40/1100Э';
  2. $valuetext = mb_convert_encoding($valuetext, 'utf-8', mb_detect_encoding($valuetext));
  3. $valuetext = mb_strtolower($valuetext, 'UTF-8');
  4. $result = preg_replace('#[^A-ZА-ЯЁ0-9]+#ui', '', $valuetext);
  5. echo 'Результат - ' . $result . '|' . mb_strlen($result);
  6. // Результат - п401100э|10
  7.  

(Отредактировано автором: 20 Июня, 2012 - 17:01:01)

 
 Top
sheff2000
Отправлено: 20 Июня, 2012 - 17:11:19
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




Мелкий пишет:
Всё равно у меня подозрения, что mb_strtolower портит строку.

если к строке применить только ее - то с кириллическими строками ничего вообще не происходит, регистр символов в латинских строках изменяется как надо.
именно применение preg_replace (str_replace() тоже ) приводит к указанному в теме результату.

Мелкий пишет:
sheff2000 пишет:
но вот проверяю кодировку функцией:

Может безбожно врать. Или, как в вашем случае, определять не всё. ASCII ведь полностью входит в UTF8 (и ещё большую кучу кодировок).

спасибо, тоже читал на многих форумах о таком

Мелкий пишет:

Попробуйте в порядке эксперимента
PHP:
скопировать код в буфер обмена
  1. $valuetext = mb_strtolower(preg_replace("/[^A-ZА-ЯЁ0-9]+/ui", '', $valuetext));


попробывал - результат тот же, получаю набор цифр

UPD.
Кажется нашел примерную причину "ошибок" и почему кодировка как ASCII определяется. В коде парсера при вытягивании значений из файла идет посимвольное преобразование функцией ord() - похоже от сюда и кодировка... но почему на до preg_replace() все правильно выводится - непонятно Недовольство, огорчение
(Добавление)
fdr21 пишет:
вроде бы так работает
PHP:
скопировать код в буфер обмена
  1. $valuetext = 'П-40/1100Э';
  2. $valuetext = mb_convert_encoding($valuetext, 'utf-8', mb_detect_encoding($valuetext));
  3. $valuetext = mb_strtolower($valuetext, 'UTF-8');
  4. $result = preg_replace('#[^A-ZА-ЯЁ0-9]+#ui', '', $valuetext);
  5. echo 'Результат - ' . $result . '|' . mb_strlen($result);
  6. // Результат - п401100э|10
  7.  


к сожалению так тоже не работает Недовольство, огорчение ...
если в самом коде написать то все работает.
Но в том то и дело что значение этой переменной я получаю парсером с xls-файла

(Отредактировано автором: 20 Июня, 2012 - 17:20:07)

 
 Top
Мелкий Супермодератор
Отправлено: 20 Июня, 2012 - 18:54:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




sheff2000 пишет:
но почему на до preg_replace() все правильно выводится - непонятно

Потому что бинарный поток сохраняется корректным. По сети браузеру-то идут байты, а не символы. Вот нормально и склеиваются.

Этот парсер умеет выдавать данные в каком-нибудь cp1251? Тогда можно через iconv нормально скормить данные. Хотя идеологически правильнее будет поправить сам парсер.


-----
PostgreSQL DBA
 
 Top
fdr21
Отправлено: 20 Июня, 2012 - 18:59:31
Post Id



Гость


Покинул форум
Сообщений всего: 86
Дата рег-ции: Июнь 2012  


Помог: 5 раз(а)




Попробуйте заменить
sheff2000 пишет:

$valuetext = mb_convert_encoding($valuetext, 'utf-8', mb_detect_encoding($valuetext));

на
PHP:
скопировать код в буфер обмена
  1. $valuetext = mb_convert_encoding($valuetext, 'utf-8', 'cp1251');
 
 Top
sheff2000
Отправлено: 20 Июня, 2012 - 22:54:27
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




fdr21 пишет:
Попробуйте заменить
на
PHP:
скопировать код в буфер обмена
  1. $valuetext = mb_convert_encoding($valuetext, 'utf-8', 'cp1251');

спасибо за совет, но тоже не поможет уже пробовал эту и множество других комбинаций и функций преобразования кодировки Недовольство, огорчение

Мелкий пишет:
Потому что бинарный поток сохраняется корректным. По сети браузеру-то идут байты, а не символы

как то не задумывался про "физику" этого процесса, по всей видимости Вы правы - это многое сразу же объясняет..
Мелкий пишет:
Этот парсер умеет выдавать данные в каком-нибудь cp1251?

порылся, на сколько мог его понять, в коде - нет, там все идет через функции ord() ...

появилась "гениальная" идея - раз потоком идет все верно, то завернуть этот поток в xml файл, а длаее уже спокойно парсить полученный xml Улыбка
ну или другой вариант, наверное самый правильный, писать свой парсер xls

Спасибо Вам за помощь. Тема еще открыта - если есть идеи/предложения буду рад их прочесть.
 
 Top
sheff2000
Отправлено: 21 Июня, 2012 - 09:53:31
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




Проблему решил - тему можно закрывать.

Кому интересно:
Excel Parser Pro - отличный парсер xls файлов, но в процессе парсинга все символы с файла преобразовываются в HTML сущности. С латинскими буквами и цифрами пробел не возникает, но если есть кириллица - то дальнейшая обработка строк будет невозможна.

Решение.
Оказалось очень простым.
При вытягивании из xls значения ячейки надо всего навсего выполнить следующее преобразование:
PHP:
скопировать код в буфер обмена
  1. $valuetext = html_entity_decode( $valuetext, ENT_QUOTES, 'utf-8') ;    
  2. # $valuetext - значение загруженное из ячейки экселя
  3. # utf-8 желаемая кодировка на выходе. можно использовать свою


Еще раз всем спасибо кто пытался помочь.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Кодировки и все смежное »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB