PHP

Реализация шорткодов на регулярных выражениях

Часто на сайтах возникает необходимость вставлять в тексты страниц информационные блоки - баннеры, телефоны и т.д. Как правило, содержание этих блоков часто изменяется что существенно усложняет работу контент менеджера.

Упростить эту задачу помогут шорткоды (shortcode). Смысл их в том что в панели управления сайта вместо нужного контента вставляется символьный код, например [[phone]], а при выводе на фронте сайта он заменяется.

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

1

Шорткоды с контентом из массива

Данный функционал реализуется на регулярных выражениях функцией preg_match_all:

$text = '
    <p>
        Повседневная практика показывает, что укрепление и развитие структуры требуют от нас 
        анализа дальнейших направлений развития. Идейные соображения высшего порядка, а также 
        начало повседневной работы по формированию позиции требуют определения и уточнения.
    </p>
    [[phone]]
    <p>
        Идейные соображения высшего порядка, а также сложившаяся структура организации позволяет 
        выполнять важные задания по разработке модели развития. Товарищи! начало повседневной 
        работы по формированию позиции требуют от нас анализа финансовых условий. 
    </p>
    [[address]]
';

// Массив значений.
$info = array(
    'phone'   => '+7 (495) 000-00-00',
    'address' => 'г.Москва, Тверская д.9',
);

// Поиск и замена.
preg_match_all("|\[\[(.*)\]\]|U", $text, $matches);
if (!empty($matches[1])) {
    foreach ($matches[1] as $row) {
        $replase = (empty($info[$row])) ? '' : $info[$row];
        $text = str_ireplace('[[' . $row . ']]', $replase, $text);
    }
}

echo $text;
Показать результат
<p>
    Повседневная практика показывает, что укрепление и развитие структуры требуют от нас 
    анализа дальнейших направлений развития. Идейные соображения высшего порядка, а также 
    начало повседневной работы по формированию позиции требуют определения и уточнения.
</p>
+7 (495) 000-00-00
<p>
    Идейные соображения высшего порядка, а также сложившаяся структура организации позволяет 
    выполнять важные задания по разработке модели развития. Товарищи! начало повседневной 
    работы по формированию позиции требуют от нас анализа финансовых условий. 
</p>
г.Москва, Тверская д.9
2

Шорткоды с контентом из базы данных

В следующим примере используются шорткод вида [[blocks.XX]], где XX указывает ID нужной записи. Для доступа к базе данных используется класс-обертка PDO.

$text = '
    <p>
        Повседневная практика показывает, что укрепление и развитие структуры требуют от нас 
        анализа дальнейших направлений развития. Идейные соображения высшего порядка, а также 
        начало повседневной работы по формированию позиции требуют определения и уточнения.
    </p>
    [[blocks.1]]
    <p>
        Идейные соображения высшего порядка, а также сложившаяся структура организации позволяет 
        выполнять важные задания по разработке модели развития. Товарищи! начало повседневной 
        работы по формированию позиции требуют от нас анализа финансовых условий. 
    </p>
    [[blocks.2]]
';

// Поиск и замена.
preg_match_all("|\[\[blocks\.(.*)\]\]|U", $text, $matches);
if (!empty($matches[1])) {
    foreach ($matches[1] as $row) {
        $item = DB::getRow("SELECT `text` FROM `blocks` WHERE `id` = ?", $row);
        $replase = (empty($item['text'])) ? '' : $item['text'];
        $text = str_ireplace('[[blocks.' . $row . ']]', $replase, $text);
    }
}

echo $text;
3

Замена при буферизации вывода

Как вариант замену кодов можно производить в callback-функции буферизации вывода ob_start:

function callback($buffer)
{
    preg_match_all("|\[\[blocks\.(.*)\]\]|U", $buffer, $matches);
    if (!empty($matches[1])) {
        foreach ($matches[1] as $row) {
            $item = DB::getRow("SELECT `text` FROM `blocks` WHERE `id` = ?", $row);
            $replase = (empty($item['text'])) ? '' : $item['text'];
            $buffer = str_ireplace('[[blocks.' . $row . ']]', $replase, $buffer);
        }
    }

    return $buffer;
}

ob_start('callback');

?>
<html>
<body>
    <p>
        Повседневная практика показывает, что укрепление и развитие структуры требуют от нас 
        анализа дальнейших направлений развития. Идейные соображения высшего порядка, а также 
        начало повседневной работы по формированию позиции требуют определения и уточнения.
    </p>
    [[blocks.1]]
    <p>
        Идейные соображения высшего порядка, а также сложившаяся структура организации позволяет 
        выполнять важные задания по разработке модели развития. Товарищи! начало повседневной 
        работы по формированию позиции требуют от нас анализа финансовых условий. 
    </p>
    [[blocks.2]]
</body>
</html>