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 :: Выражение для парсинга функций
Покинул форум
Сообщений всего: 74
Дата рег-ции: Июнь 2012
Помог: 1 раз(а)
Здравствуйте!
Есть задача спарсить php функцию, а тоесть получить её код. Проблема именно в закрывающей }, как точно определить закрывающий тег функции?
Если файл большой, то использование функций для массивов будет неоптимально (тогда - комбинация while и fgets)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Мелкий
Отправлено: 04 Сентября, 2013 - 12:00:10
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Регуляркой такое лучше не делать. Потом вспомните, что ещё комментарии есть, которые могут включать всё, что угодно. А ещё есть строки, разрывы ?> и <? и прочие прелести.
Но если очень хочется регуляркой - рекурсивные регулярные выражения. PCRE умеет такое.
Что-то гуглится здесь: http://php.net/manual/ru/regexp....ce.recursive.php , но не читал. Лучше Дж.Фридл "Регулярные выражения" почитать, в 3-ем издании и PHP затронут.
----- PostgreSQL DBA
BAS-P
Отправлено: 04 Сентября, 2013 - 12:30:11
Гость
Покинул форум
Сообщений всего: 74
Дата рег-ции: Июнь 2012
Помог: 1 раз(а)
Да вот я тут недавно сталкивался с Reflection, но как-то прошел мимо.
А с помощью него можно еще и перезаписывать код метода, или только получать его? Тоесть заменить код на новый и уже перезаписать файл. (а то вижу у него есть только методы get/has/is...)
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
получит данные с файла до начала функции + сама функция + данные функции после = профит
BAS-P
Отправлено: 04 Сентября, 2013 - 12:48:28
Гость
Покинул форум
Сообщений всего: 74
Дата рег-ции: Июнь 2012
Помог: 1 раз(а)
caballero пишет:
если получил код метода то перезаписать его можно обычной
str_replace
А если я перезаписываю метод test() на примере в первом сообщении, а его код существует и во втором методе? оба заменяются. получается нужно разбивать код на две части: вторая часть начиная с того метода который нужно перезаписать, заменять с str_replace но с дополнением чтобы заменило только один раз, и назад соединять. Или же если регуляркой то preg_replace, но тогда нужна регулярка о которой вопрос в первом сообщении этой темы. Но с регуляркой согласен что проблематично.
caballero пишет:
а вообще фигней занимаетесь. Скажите конкретно зачем вам это надо и вам напишут в чем конкретно эта фигня заключатся.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
BAS-P
Снова, существуют штатные средства для этой задачи. А именно - расширение RunKit . Reflection не предназначен для таких манипуляций. На деле - если требуется смена кода метода во время исполнения приложения - Вы делаете что-либо не корректно, не существует архитектур, где без этого бы нельзя было обойтись.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
caballero
Отправлено: 04 Сентября, 2013 - 13:03:39
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
EuGen
есть единственная задача когда требуется парсинг кода (кроме самих компиляторов разумеется) - это написание редакторов и всяких плагинов к ним (рефакторинг и иже с ними). Но тут только лексический анализатор и граматика в форме Бекуса-Наура или типа того.
Покинул форум
Сообщений всего: 74
Дата рег-ции: Июнь 2012
Помог: 1 раз(а)
EuGen пишет:
Снова, существуют штатные средства для этой задачи. А именно - расширение RunKit .
Спасибо, правда, он требует специальную конфигурацию (runkit.internal_override)...
EuGen пишет:
а деле - если требуется смена кода метода во время исполнения приложения - Вы делаете что-либо не корректно, не существует архитектур, где без этого бы нельзя было обойтись.
Суть задачи заключается в следующем: я пробую сделать менеджер страниц на Yii Framework без использования баз данных. То-есть не хочу чтобы страницы хранились в базе данных, а только в самом контроллере и views файлах. Можно конечно использовать CViewAction и тогда для страниц не требуются методы в контроллере (actionPage), но тогда если нужен php код к странице - придется его размещать в самом view-файле, что не есть хорошо. (например страница обратной связи.)
EuGen
Отправлено: 04 Сентября, 2013 - 13:20:46
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
caballero пишет:
это написание редакторов и всяких плагинов к ним (рефакторинг и иже с ними).
Сомневаюсь, что это потребуется в веб - первое, ну и - как Вы уже заметили - для таких вещей существует РБНФ и прочие соответствующие инструменты - второе. Код анализируется не в терминах методов, а в терминах лексем.
BAS-P пишет:
Суть задачи заключается в следующем
Это должно было быть первым сообщением темы.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
BAS-P
Отправлено: 04 Сентября, 2013 - 14:00:04
Гость
Покинул форум
Сообщений всего: 74
Дата рег-ции: Июнь 2012
Помог: 1 раз(а)
Ну в общем спасибо, попробую с Reflection а насчет редактирования еще подумаю
Покинул форум
Сообщений всего: 15
Дата рег-ции: Апр. 2013
Помог: 0 раз(а)
Прочёл только первое сообщение. В голову приходит только посчитать скобки фигурные, разбить на пары их. Ну и если их число не чётное, генерировать ошибку. Именно так я и попытался бы решить эту задачу при надобности.
Чуть не забыл. Отсчет начинать после function.
P.S.
Позвольте поинтересоваться. А зачем Вам это понадобилось?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.