Заменить шорткод на HTML

Есть обычный текст подтягивающийся из БД, а внутри текста есть строка [link href="/news" name="Новости" class="apply"]. Я хочу, чтобы эта строка на выходе заменялась на <a class="btn btn-med btn-apply" href="/news">Новости</a>. Т.е. типа как шорткоды в WordPress реализованы (но нигде не могу найти примеры чисто на PHP). Как это можно реализовать? str_replace тут не подходит, так как шорткод разный может быть. А в регулярных выражениях я не разбираюсь. Может у кого есть готовые решения?


Ответы (1 шт):

Автор решения: Алексей Шиманский

Достаточно сделать для начала так, как видите, а потом пытаться оптимизировать.

К Symfony, кстати, вопрос не имеет никакого отношения.

Самый простой способ (пока без использования классов, но это можно потом переделать):

  1. Берём "шорткод", обрезаем скобки [ и ] (например через trim)

  2. Разбиваем строку по пробелу, получив все атрибуты строки (используя explode)

  3. Тип элемента будет содержаться в [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>"
         ...
     }
    
  4. Там где в п.3 написано "Тут логика прохождения по остальным элементам массива для формирования ключ-значения HTML атрибутов" - нужно пробежаться по оставшимся элементам массива, каждый из них разбить через explode и = и сформировать новые значения, если такой шаг необходим. Если всё вставляется как есть - то вставить в элементы HTML как они прописаны

→ Ссылка