Работая над личным проектом, я использую PHP, и я хотел бы запустить preg_replace_callback
функция против следующих строк:
1. {{hello}}
2. {{hello}{there}{how}{are}{you}}
Я хотел бы обнаружить hello
there
how
are
а также you
и отправить в функцию как $matches[0-4]
(или сколько бы их ни было, должно быть от 1 до бесконечности).
Вышесказанное не так уж сложно для меня, но мне бы тоже понравилось, если я пропущу эту строку:
3. {{hello}{there}{how}{are}{you}} blabla {{I}{Am}{Fine}{Thanks for asking}}
Функция, которую я посылаю $matches[0-X]
он должен запускаться ДВАЖДЫ, так как созданная мною маленькая {{}} система открывается и закрывается дважды!
Шаблон также должен игнорировать {текст как таковой сам по себе}, но НО ДОЛЖЕН работать для {{текст, подобный этому, то есть только один блок}}.
Если я могу напечатать вещи с косой чертой в качестве условия, например:
4. {{ignore this next closing curly bracket \} as the slash makes it text}
…И он также может затем удалить эту ненужную обратную косую черту … ну … ЧТОБЫ ПОЛУЧИТЬ МАССОВЫЕ БОНУСНЫЕ ТОЧКИ !!
Все это preg_replace_callback
тоже, поэтому мне нужно заменить весь {{thing} {here}} тем, что возвращает функция.
Это просто? Или сложно? Я застрял!
Люблю учиться, хотя, если бы кто-нибудь мог мне помочь, это было бы более ценно, чем вы могли себе представить. Спасибо!
EDIT p.s. Если это слишком сложно сделать, как я объяснил выше, я бы согласился, что это работает для чего-то вроде:
[{hello}{there}{how}{are}{you}]
Использование квадратных скобок, а также фигурных — но это гораздо менее желательно …
Переменное количество групп захвата невозможно; тем не менее, вы можете выполнить глобальное сопоставление и сопоставить их все (было бы почти невозможно увидеть, пришло ли оно из первой или второй группы, например, с примером № 3):
(?:\G(?!\A)|\{)[^}]*?\K\{(.*?)(?<!\\)\}
Постскриптум Вот пример выражения, чтобы показать, почему группы захвата переменных невозможны. Группа повторного захвата будет заменяться каждым совпадением, и содержимое будет совпадать с содержимым финального совпадения: (a)+bc
Других решений пока нет …