И снова регулярки - захватить несколько строк сверху и снизу от найденного слова

Royal Flash

-=MaestrO=-
В процессе перевода скриптов на UTF-8 появилась необходимость найти все не мультибайтовые функции, и в случае необходимости, заменить их на MB (strtolower -> mb_strtolower). Обычный preg_replace() не подойдет - так как перед заменой, нужно просмотреть отрезок кода, чтобы определить, нужна ли вообще замена. Для просмотра куска кода написал регулярку:
PHP:
$search_pattern = '~('.".*(?:\n)".'.*(?<!mb_|\$)strlen\s?\(.+'."(?:\n).*".')~';
Но, поскольку в regexp я не силен, то составить её правильно для меня не просто. Нужно, чтобы регулярка захватывала 5 строк кода до strlen и 5 строк после (strlen может быть первой, второй, ... строкой и последней, предпоследней, ...). Разделитель строк может быть любым: /r/n, /n или что-то еще, что вообще может служить разделителем. Также, перед strlen не должно быть mb_, $ - но это исключение мне вроде бы удалось реализовать верно.

Был бы признателен за помощь в решении задачи с захватом предидущих-последующих строк...
 

fixxxer

К.О.
Партнер клуба
Не изобретай велосипед. Открываешь проект в любой современной IDE и идешь в меню Refactor (посоветовал пользователь вима, угу :))
 

artnik7

Новичок
Как-то так
PHP:
$search_pattern = '/((?:^|[\n\r]|\r\n)[^\r\n]*){0,6}[^\r\n]*(?<!mb_|\$)strlen[^\r\n]*((?:[\n\r]|\r\n)[^\r\n]*){0,5}/';
 

AmdY

Пью пиво
Команда форума
fixxxer
в нетбинсе для стандартных функций рефакторинг не работает, ругает что не незя вызвать в данном контексте :( сам хотел посоветовать, но возможно в других ide всё лучше?
 

AmdY

Пью пиво
Команда форума
а, ты навёл меня на идею, функцию можно объявить в этом проекте, тогда в нетбинсе всё палит.
 

Вложения

AmdY

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

Royal Flash

-=MaestrO=-
А обычный оверлоад чем не устраивает?
Это очередной костыль, который даже не заменяет все функции... Т.е. попытаться при помощи оверлоада сделать так, чтобы заработало - можно, но если хочешь сделать хорошо и надолго - не нужно.

По поводу IDE - сейчас разбираюсь, спасибо за направление!
 

lagoff

Новичок
Это очередной костыль, который даже не заменяет все функции... Т.е. попытаться при помощи оверлоада сделать так, чтобы заработало - можно, но если хочешь сделать хорошо и надолго - не нужно.
Не спорю, все зависит от задачи.
 
Сверху