PHP регулярные выр-ия.

DavyJohnes
На сайте с 05.01.2011
Offline
84
703

Допустим есть такой шаблон:


'/block1.*block2/is'

который получит текст между block1 и block2, очевидно. Так вот, опытным путем выяснил, что вот этот текст, который находится между блоками может быть длинной максимум 678 символом. Если 679 и более апач зависает, при это выдавая виндосовское окно завершение работы, при чем в подробностях вот что написано:


Имя сбойного приложения: httpd.exe, версия: 2.2.15.0, отметка времени: 0x4b8fed95
Имя сбойного модуля: php5ts.dll, версия: 5.2.13.13, отметка времени 0x4b853813
Код исключения: 0xc00000fd
Смещение ошибки: 0x001519ef
Идентификатор сбойного процесса: 0x14fc
Время запуска сбойного приложения: 0x01cbbc79e8d5452c
Путь сбойного приложения: D:\server\Apache\bin\httpd.exe
Путь сбойного модуля: C:\Windows\system32\php5ts.dll
Код отчета: 2726868e-286d-11e0-b1f9-c417feab73f3

Облазил весь инет в поисках решения данной проблемы. Нашел где-то что нужно изменить в php.ini


pcre.backtrack_limit=100000

на


pcre.backtrack_limit=5000000

Пробовал - не помогло.

Уважаемые знатоки, подскажите, как решить мою проблему ?

З.Ы.: Связка Apache(последняя версия)+MySQL+PHP(последняя версия)+Win7

https://handy-tools.io (https://handy-tools.io) - Набор полезных утилит для всех!
minor
На сайте с 04.10.2010
Offline
70
#1

Установи Денвер не мучайся.

PHP experience 2 year, comprehend seo
DavyJohnes
На сайте с 05.01.2011
Offline
84
#2
minor:
Установи Денвер не мучайся.

А в чем отличия м\у денвером и php+apache+mysql ?

[Удален]
#3

много таких кусков в тексте? большой исходный размер файла?

DavyJohnes
На сайте с 05.01.2011
Offline
84
#4
seodude:
много таких кусков в тексте? большой исходный размер файла?

Кусков 30-45. Исходный размер файла точно не скажу, ибо динамический, но меньше метра точно!

[Удален]
#5

DavyJohnes, значит курим регулярки :-)

".*" - прожорливый метод, вам надо писать ".*?"

удачи) вылетает я тоже предполагаю чо знаю почему, но объяснять не буду, долго очень и возможно не поэтому.

попробуйте заменить как я говорю, 99% проблема исчезнет.

DavyJohnes
На сайте с 05.01.2011
Offline
84
#6
seodude:
DavyJohnes, значит курим регулярки :-)

".*" - прожорливый метод, вам надо писать ".*?"

удачи) вылетает я тоже предполагаю чо знаю почему, но объяснять не буду, долго очень и возможно не поэтому.

попробуйте заменить как я говорю, 99% проблема исчезнет.

Расскажи плиз почему вылетает, поподробнее, в случае описанном мною выше, "?" помог, а дальше составляю регулярку и ппц, вылет на вылете, ажна бесит уже.

[Удален]
#7

DavyJohnes, в двух словах. результат, который хочется выбрать из строки - то, что между ( ... ) должен быть не больше 64 килобайт. у тебя есть файлик порядка 1 мегабайта, я так понимаю что у тебя разброс по файлу этих кусков примерно одинаковый(хотя тут без разницы), важно что у тебя под "жадную" выборку попадает кусок больше 64 килобайт - вот и вылетает, почему такое происходит на форточках у пхп - вопрос хороший :-)

обычно не вылетает намертво, а просто ругается(хотя могу соврать, может тоже вылетает).

кури регулярки, по твоей задаче надо было нежадную выборку - она решила и проблему и задачу :-)

DavyJohnes
На сайте с 05.01.2011
Offline
84
#8
seodude:
DavyJohnes, в двух словах. результат, который хочется выбрать из строки - то, что между ( ... ) должен быть не больше 64 килобайт. у тебя есть файлик порядка 1 мегабайта, я так понимаю что у тебя разброс по файлу этих кусков примерно одинаковый(хотя тут без разницы), важно что у тебя под "жадную" выборку попадает кусок больше 64 килобайт - вот и вылетает, почему такое происходит на форточках у пхп - вопрос хороший :-)

обычно не вылетает намертво, а просто ругается(хотя могу соврать, может тоже вылетает).

кури регулярки, по твоей задаче надо было нежадную выборку - она решила и проблему и задачу :-)

Твой метод действительно помог, спасибо, от души, парился долго.

Понять одного не могу, уже с десяток руководств по regexp прочитал. Объясни плиз на пальцах, что здесь дает знак вопроса? Во всех доках знак вопроса это синоним {0,1} т.е. появление 1 раз или не появление вообще. Как же расшифровать ".*?".

Дословно: .-любой одиночный символ, *-любое кол-во(включая ноль). И как тут приплести "?" ? Что получается? Ноль либо одно вхождение "." т.е. любого символа ? Если так, то смысл от "*", проще было б написать просто ".?".

[Удален]
#9

на словах представь дана строка

"......а.............б...............б.................б...................б"

a.*b сожрет а.............б...............б.................б...................б

a.*?b сожрет а.............б

на словах .* - СОЖРЕТ МАКСИМУМ, то есть когда ограничители в маске находятся КАК МОЖНО ДАЛЬШЕ

.*? - как можно ближе.

.* называется квантор жадности, а .*? типа усмиренная жадность или както так называется в теории :-)

вот почитай, начиная с кванторов. расписывать некогда особо

http://www.exlab.net/tools/sheets/regexp.html

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий