Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятный preg_match(_all)

21K
24 июля 2009 года
evil_rabbit
60 / / 27.08.2008
Здравствуйте форумчане, форумчанки и форумченята.
Трабла возникла у меня
preg_match_all не могу понять работы суть...
Ибо криво возвращает значение
Мозг вскипает словно гейзер
Тяжко мне без этой функции
Ибо на ней основана система анализа выражений условных
Гуглил три дня и три ночи
Но кроме примеров похожих друг на друга словно близнецы
Не нашел ответов.
Взываю к Вам, о Великие. Пошлите благодать.
Знать желаю ответ...
Как же мне получить список соответствий всех
И их смещений в тексте...

На примере кода:
 
Код:
[if(val1=val2)]
action1
[else]
action2
 [for($i=0;<10;+1)]
 action3
 [endfor]
[endif]


...Получить, если можно, все, что в скобках квадратных, вместе со смещением
Для дальнейшего анализа их
И создания гармонии в шаблоне
353
24 июля 2009 года
Nixus
840 / / 04.01.2007
Автор, вам не нужны смещения. Вам нужно что-то вроде:
 
Код:
preg_match_all( "/(.*?)(\\[[^\\]]*\\]|$)/", $text, $matches )

, после чего обходим $matches.
21K
24 июля 2009 года
evil_rabbit
60 / / 27.08.2008
Цитата: Nixus
Автор, вам не нужны смещения. Вам нужно что-то вроде:
 
Код:
preg_match_all( "/(.*?)(\\[[^\\]]*\\]|$)/", $text, $matches )

, после чего обходим $matches.



А каким же непостижимым способом мне разбирать многоуровневые логические конструкции?!
При помощи смещений я буду искать соответствующие закрывающие теги для открывающих одного и того же уровня.
Для одноуровневых у меня есть решение, которое меня уже не устраивает

353
24 июля 2009 года
Nixus
840 / / 04.01.2007
Цитата: evil_rabbit
При помощи смещений я буду искать соответствующие закрывающие теги для открывающих одного и того же уровня.


Вот задачка: У вас есть смещение для открывающейся конструкции if. Надите для нее закрывающуюся. Не забываем что могут быть вложенные if и пр.
Не забываем что могут быть такие ситуации:

 
Код:
[for...]
        [if...]
        [endfor] // for закрылся ранше чем if.
[endif]

Ошибки ловить не будем?

Автор, такие задачи не решаются простыми методами. Серьезные интерпретаторы (а вы собрались писать таковой) не выполняют скрипт по ходу разбора. Сначала они генерируют код, а затем его исполняют.

Цитата: evil_rabbit
А каким же непостижимым способом мне разбирать многоуровневые логические конструкции?!


Массив используемый как стэк (или рекурсия) и перебор результата preg_match_all творят чудеса. А вы думали одними preg_* обойтись?

На пальцах алгоритм такой:
При встрече [if] кладем на вершину стека код, например, 1. При встрече [endif] смотрим, если в вершине стэка 1, значит все хорошо, убираем 1 с вершины стэка и генерируем необходимый код; если в вершине не 1, то у нас ошибка.

21K
24 июля 2009 года
evil_rabbit
60 / / 27.08.2008
Вы думаете, что я все это не обдумывал?!
Ну разумеется, что я уже гуглил, википедировал и прочее...
Думал и про стек, и про рекурсию.
И не одним preg_* сыт программист...
Как минимум можно юзать preg_replace_callback и им (еще и функцией) такого наворотить, что...
А смещения мне как раз для того, чтобы находить начала и конец, а то, что между ними снова обрабатывать. И так до бесконечности (или пока сервер не сгорит в потугах)...
244
24 июля 2009 года
UAS
2.0K / / 19.07.2006
Бред какой-то. А если я не хочу использовать такую вложенность? Или например сделаю отступ не в 1 пробел, а в 4? Или в 2? Да и зачем так страдать с вашим шаблонизатором?
Возьмите Smarty и посмотрите как там все устроено. И можно более-менее по аналогии строить.
Поддержу Nixus. Он вам верно говорит, как надо делать. А то уж слишком все нагрузочно будет.
353
24 июля 2009 года
Nixus
840 / / 04.01.2007
Цитата: evil_rabbit
А смещения мне как раз для того, чтобы находить начала и конец, а то, что между ними снова обрабатывать. И так до бесконечности (или пока сервер не сгорит в потугах)...


Вы не сможете получить смещения для такого алгоритма, в том-то и проблема.

2.1K
24 июля 2009 года
wAngel
129 / / 23.11.2004
Есть небезызвестная и замечательная книга про компиляторы - Dragon Book.
Если автор серьезно занялся, то ознакомиться стоит в перую очередь наверное с ней.
21K
25 июля 2009 года
evil_rabbit
60 / / 27.08.2008
Цитата: UAS
Бред какой-то. А если я не хочу использовать такую вложенность? Или например сделаю отступ не в 1 пробел, а в 4? Или в 2? Да и зачем так страдать с вашим шаблонизатором?
Возьмите Smarty и посмотрите как там все устроено. И можно более-менее по аналогии строить.
Поддержу Nixus. Он вам верно говорит, как надо делать. А то уж слишком все нагрузочно будет.



А причем тут пробелы? Смещение это позиция в тексте от самого начала, а не отступ от левого края.

Цитата: Nixus
Вы не сможете получить смещения для такого алгоритма, в том-то и проблема.


Видимо мы с Вами говорим о разном. Вы имеете ввиду систему, которую выдумал UAS?

Цитата: wAngel
Есть небезызвестная и замечательная книга про компиляторы - Dragon Book.
Если автор серьезно занялся, то ознакомиться стоит в перую очередь наверное с ней.


Благодарю, почитаю...

353
25 июля 2009 года
Nixus
840 / / 04.01.2007
Цитата: evil_rabbit
Видимо мы с Вами говорим о разном. Вы имеете ввиду систему, которую выдумал UAS?


Мы говорим о том как написать интерпретатор языка с вложенными конструкциями на php. Я вам описал самый простой способ. Если вы считатете что вы сможете получить нужные вам смещения - флаг в руки.

21K
25 июля 2009 года
evil_rabbit
60 / / 27.08.2008
Цитата: Nixus
Мы говорим о том как написать интерпретатор языка с вложенными конструкциями на php. Я вам описал самый простой способ. Если вы считатете что вы сможете получить нужные вам смещения - флаг в руки.


Вообще-то изначально я планировал получать смещения при помощи preg_match_all с флагом PREF_OFFSET_CAPTURE, который, насколько мне известно, возвращает подстроку и её смещение в тексте. И изначальный вопрос звучал так: "каким местом preg_match_all возвращает значение, я не понимаю как получить смещение из массива, возвращаемого этой функцией"

353
25 июля 2009 года
Nixus
840 / / 04.01.2007
Цитата: evil_rabbit
Вообще-то изначально я планировал получать смещения при помощи preg_match_all с флагом PREF_OFFSET_CAPTURE, который, насколько мне известно, возвращает подстроку и её смещение в тексте. И изначальный вопрос звучал так: "каким местом preg_match_all возвращает значение, я не понимаю как получить смещение из массива, возвращаемого этой функцией"


Автор, еще раз повторяю, смещения вам ничего не дадут. Вам придется, в любом случае, отслеживать вложенность.

21K
25 июля 2009 года
evil_rabbit
60 / / 27.08.2008
Цитата: Nixus
Автор, еще раз повторяю, смещения вам ничего не дадут. Вам придется, в любом случае, отслеживать вложенность.


Как упорно Вы не хотите мне помогать :)
Я же не прошу Вас сделать это за меня. Я просто пытаюсь понять как эта злосчастная функция возвращает значение. Реализация - это моя проблема. Я учусь только на своих ошибках, и мне бесполезно что-то доказывать. Поэтому, либо не мешайте либо... ;)

353
25 июля 2009 года
Nixus
840 / / 04.01.2007
Цитата: evil_rabbit
Как упорно Вы не хотите мне помогать :)
Я же не прошу Вас сделать это за меня. Я просто пытаюсь понять как эта злосчастная функция возвращает значение. Реализация - это моя проблема. Я учусь только на своих ошибках, и мне бесполезно что-то доказывать. Поэтому, либо не мешайте либо... ;)


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

21K
25 июля 2009 года
evil_rabbit
60 / / 27.08.2008
Цитата: Nixus
Вам никто не обязан помогать.


Разве я кого-нибудь заставляю? Это дело сугубо добровольное.

Цитата: Nixus
Хотите анальных приключений - вперед, никто мешать и не собирался.

Это угроза?

Давайте прекратим эту словесную перепалку и разойдемся как цивилизованные люди, а не как первобытные дядьки с дубинками...

----UPD
т.к. тема переросла в непонятно что. И я нагуглил ссылку в тему. Ничья помощь по этой темк больше требуется.
UAS, wAngel, и, конечно же, Nixus, спасибо вам всем большое

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог