Заменить шорткод на HTML
Есть обычный текст подтягивающийся из БД, а внутри текста есть строка [link href="/news" name="Новости" class="apply"]
.
Я хочу, чтобы эта строка на выходе заменялась на <a class="btn btn-med btn-apply" href="/news">Новости</a>
. Т.е. типа как шорткоды в WordPress реализованы (но нигде не могу найти примеры чисто на PHP). Как это можно реализовать? str_replace тут не подходит, так как шорткод разный может быть. А в регулярных выражениях я не разбираюсь. Может у кого есть готовые решения?
Ответы (1 шт):
Достаточно сделать для начала так, как видите, а потом пытаться оптимизировать.
К Symfony, кстати, вопрос не имеет никакого отношения.
Самый простой способ (пока без использования классов, но это можно потом переделать):
Берём "шорткод", обрезаем скобки
[
и]
(например черезtrim
)Разбиваем строку по пробелу, получив все атрибуты строки (используя
explode
)Тип элемента будет содержаться в
[0]
индексе полученного массива. Собственно это ключевой момент. Предположим, что таких элементов может быть несколько, тогда будем иметьswitch
(ну илиmatch
илиif, elseif
и т.д.), который будет отрисовывать элемент, в зависимости от типа, т.е. например:switch ($elementParts[0]) { case "link": // Тут логика прохождения по остальным элементам массива // для формирования ключ-значения HTML атрибутов return "<a class="$formedClass" href="formedHref">$formedText</a>"; case "div": // Тут логика прохождения по остальным элементам массива // для формирования ключ-значения HTML атрибутов return "div class="$formedClass">$formedText</div>" ... }
Там где в п.3 написано "Тут логика прохождения по остальным элементам массива для формирования ключ-значения HTML атрибутов" - нужно пробежаться по оставшимся элементам массива, каждый из них разбить через
explode
и=
и сформировать новые значения, если такой шаг необходим. Если всё вставляется как есть - то вставить в элементы HTML как они прописаны