Непонятный preg_match(_all)
Трабла возникла у меня
preg_match_all не могу понять работы суть...
Ибо криво возвращает значение
Мозг вскипает словно гейзер
Тяжко мне без этой функции
Ибо на ней основана система анализа выражений условных
Гуглил три дня и три ночи
Но кроме примеров похожих друг на друга словно близнецы
Не нашел ответов.
Взываю к Вам, о Великие. Пошлите благодать.
Знать желаю ответ...
Как же мне получить список соответствий всех
И их смещений в тексте...
На примере кода:
action1
[else]
action2
[for($i=0;<10;+1)]
action3
[endfor]
[endif]
...Получить, если можно, все, что в скобках квадратных, вместе со смещением
Для дальнейшего анализа их
И создания гармонии в шаблоне
, после чего обходим $matches.
, после чего обходим $matches.
А каким же непостижимым способом мне разбирать многоуровневые логические конструкции?!
При помощи смещений я буду искать соответствующие закрывающие теги для открывающих одного и того же уровня.
Для одноуровневых у меня есть решение, которое меня уже не устраивает
Вот задачка: У вас есть смещение для открывающейся конструкции if. Надите для нее закрывающуюся. Не забываем что могут быть вложенные if и пр.
Не забываем что могут быть такие ситуации:
[if...]
[endfor] // for закрылся ранше чем if.
[endif]
Ошибки ловить не будем?
Автор, такие задачи не решаются простыми методами. Серьезные интерпретаторы (а вы собрались писать таковой) не выполняют скрипт по ходу разбора. Сначала они генерируют код, а затем его исполняют.
Массив используемый как стэк (или рекурсия) и перебор результата preg_match_all творят чудеса. А вы думали одними preg_* обойтись?
На пальцах алгоритм такой:
При встрече [if] кладем на вершину стека код, например, 1. При встрече [endif] смотрим, если в вершине стэка 1, значит все хорошо, убираем 1 с вершины стэка и генерируем необходимый код; если в вершине не 1, то у нас ошибка.
Ну разумеется, что я уже гуглил, википедировал и прочее...
Думал и про стек, и про рекурсию.
И не одним preg_* сыт программист...
Как минимум можно юзать preg_replace_callback и им (еще и функцией) такого наворотить, что...
А смещения мне как раз для того, чтобы находить начала и конец, а то, что между ними снова обрабатывать. И так до бесконечности (или пока сервер не сгорит в потугах)...
Возьмите Smarty и посмотрите как там все устроено. И можно более-менее по аналогии строить.
Поддержу Nixus. Он вам верно говорит, как надо делать. А то уж слишком все нагрузочно будет.
Вы не сможете получить смещения для такого алгоритма, в том-то и проблема.
Если автор серьезно занялся, то ознакомиться стоит в перую очередь наверное с ней.
Возьмите Smarty и посмотрите как там все устроено. И можно более-менее по аналогии строить.
Поддержу Nixus. Он вам верно говорит, как надо делать. А то уж слишком все нагрузочно будет.
А причем тут пробелы? Смещение это позиция в тексте от самого начала, а не отступ от левого края.
Видимо мы с Вами говорим о разном. Вы имеете ввиду систему, которую выдумал UAS?
Если автор серьезно занялся, то ознакомиться стоит в перую очередь наверное с ней.
Благодарю, почитаю...
Мы говорим о том как написать интерпретатор языка с вложенными конструкциями на php. Я вам описал самый простой способ. Если вы считатете что вы сможете получить нужные вам смещения - флаг в руки.
Вообще-то изначально я планировал получать смещения при помощи preg_match_all с флагом PREF_OFFSET_CAPTURE, который, насколько мне известно, возвращает подстроку и её смещение в тексте. И изначальный вопрос звучал так: "каким местом preg_match_all возвращает значение, я не понимаю как получить смещение из массива, возвращаемого этой функцией"
Автор, еще раз повторяю, смещения вам ничего не дадут. Вам придется, в любом случае, отслеживать вложенность.
Как упорно Вы не хотите мне помогать :)
Я же не прошу Вас сделать это за меня. Я просто пытаюсь понять как эта злосчастная функция возвращает значение. Реализация - это моя проблема. Я учусь только на своих ошибках, и мне бесполезно что-то доказывать. Поэтому, либо не мешайте либо... ;)
Я же не прошу Вас сделать это за меня. Я просто пытаюсь понять как эта злосчастная функция возвращает значение. Реализация - это моя проблема. Я учусь только на своих ошибках, и мне бесполезно что-то доказывать. Поэтому, либо не мешайте либо... ;)
Вам никто не обязан помогать. Хотите анальных приключений - вперед, никто мешать и не собирался.
Разве я кого-нибудь заставляю? Это дело сугубо добровольное.
Это угроза?
Давайте прекратим эту словесную перепалку и разойдемся как цивилизованные люди, а не как первобытные дядьки с дубинками...
----UPD
т.к. тема переросла в непонятно что. И я нагуглил ссылку в тему. Ничья помощь по этой темк больше требуется.
UAS, wAngel, и, конечно же, Nixus, спасибо вам всем большое