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 :: PHP + PREG + строка >50KB

 PHP.SU

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


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

> Описание: Проблема
ALEN
Отправлено: 12 Марта, 2011 - 15:07:24
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




В общем столкнулся с такой проблемой. Есть строка более 50KB текста, при обработке с помощью preg_match_all или preg_replace строка просто слетает и полностью освобождается память.
Кто-то сталкивался с такой проблемой?
Предполагал, что в момент выполнения функция preg некоторые элементы очень сильно дублируются и занимают большое количество данных. Но по умолчанию на сервере memory_limit=64MB , устанавливал даже на 128 та же проблема.
Пришлось сначала вырезать лишнее, а только потом применять preg_match в нужном мне направлении.

Никто еще не разбирался, что это такое?
 
 Top
Champion Супермодератор
Отправлено: 12 Марта, 2011 - 15:16:10
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




Хм, интересно. А можно регулярку? Ну и может быть пример строки.
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Марта, 2011 - 15:17:25
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




ALEN, думаю что это не php-проблема, это некоторое ограничение в PCRE
 
 Top
ALEN
Отправлено: 12 Марта, 2011 - 16:43:21
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




Champion
Да регулярка простая:
preg_match_all("#<table>.*</table>#",$string,$match);
DeepVarvar
Тоже есть такие мысли, но не могу найти реального подтверждения.
 
 Top
Champion Супермодератор
Отправлено: 12 Марта, 2011 - 16:52:16
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




Я точно уверен, что я работал со строками 5-7М и всё было нормально.
А никаких ни ворнингов, ничего не происходит? Опечаток в имени переменной нет?
(Добавление)
pcre.backtrack_limit - вот
 
 Top
ALEN
Отправлено: 12 Марта, 2011 - 16:56:12
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




Champion
А количество совпадений было в строке много?
 
 Top
Champion Супермодератор
Отправлено: 12 Марта, 2011 - 17:00:43
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




ALEN пишет:
количество совпадений
около 5-15.
Я выше написал волшебный параметр из php.ini. Хотя я думал, что он за другое отвечает, но судя по статье на хабре, длину строки тоже лимитирует. http://habrahabr[dot]ru/blogs/php/58560/
 
 Top
ALEN
Отправлено: 13 Марта, 2011 - 11:18:15
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




В общем прочел, что при длинне строки более 100000 символов pcre ведет себя некорректно.
При обработки коротких совпадений, все хорошо вроде у меня, а вот только если * - содержит огромное количество символов, отказывается работать.
Решением проблемы было "обрезание" лишних частей, после чего все стало работать корректно.

P.S. Руки бы оторвал тем вебмастерам, у кого html код для пользователя в размере >0.5 MB выдает.
 
 Top
JustUserR
Отправлено: 14 Марта, 2011 - 12:39:35
Post Id



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


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


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




ALEN пишет:
Пришлось сначала вырезать лишнее, а только потом применять preg_match в нужном мне направлении
В качестве возможного варианта решения предполагаемой задачи, закючающейся в проведении выделение требуемых элементов HTML-блоков из заданного информационного поля целесообразно использование средств XML-анализаторов, обеспечивающих стабильную работу на основании осуществления разграничения уровня выбираемых объектов сопоставлений на уровне трактования информационных полей компилируемого приложения, вследствие чего включение ограничения на сохраняемых управляемых переменных объекты не производится


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
ALEN
Отправлено: 14 Марта, 2011 - 13:08:54
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




JustUserR
Так по сути и реализовал.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB