preg_match_all: сопоставление пользовательских тегов

В настоящее время я немного играю с регулярными выражениями и хочу реализовать какие-то пользовательские теги для текстов на моем сайте. Например, если я хочу внедрить изображение в текст, я использую для этого следующий тэг скобок…

Lorem ipsum dolor sit amet (изображение: tiger.jpg ширина: 120 высота: 200 название: на этой картинке изображен тигр) sed diam nonumy eirmod tempor invidunt

Теперь я хочу, чтобы мой PHP-скрипт 1. находил эти теги скобок и 2. читал отдельные теги в этих скобках, поэтому я получаю какой-то массив, например…

$attributes = array(
    'image' => 'tiger.jpg',
    'width' => '150',
    'height' => '250',
    'title' => 'This picture shows a tiger',
);

Сложность (для меня) заключается в том, что «значения» могут содержать все, что угодно, если только они не содержат что-то вроде (\w+)\:, потому что это начало другого тега. Следующий фрагмент представляет то, что у меня есть на данный момент — поиск элементов в скобках работает до сих пор, но разделение содержимого скобок на отдельные теги на самом деле не работает. Я использовал (\w+) для сопоставления значения просто как заполнитель — это не будет соответствовать «tiger.jpg» или «На этом изображении изображен тигр» или чему-то еще. Я надеюсь, вы понимаете, что я имею в виду! ;)

<?php

$text = 'Lorem ipsum dolor sit amet (image: tiger.jpg width: 150 height: 250 title: This picture shows a tiger) sed diam nonumy eirmod tempor invidunt';

// find all tag-groups in brackets
preg_match_all('/\((.*)\)/s', $text, $matches);

// found tags?
if(!empty($matches[0])) {

    // loop through the tags
    foreach($matches[0] as $key => $val) {

        $search = $matches[0][$key]; // this will be replaced later
        $cache = $matches[1][$key]; // this is the tag without brackets

        preg_match_all('/(\w+)\: (\w+)/s', $cache, $list); // find tags in the tag-group (i.e. image, width, …)

        echo '<pre>'.print_r($list, true).'</pre>';

    }

}

?>

Было бы здорово, если бы кто-нибудь мог помочь мне из этого! Спасибо! :)


person Max Malberg    schedule 06.12.2012    source источник
comment
Разве вы не можете использовать библиотеку шаблонов вместо того, чтобы делать это с нуля?   -  person Barmar    schedule 06.12.2012
comment
Конечно, я мог бы, но я бы предпочел сделать это сам, поскольку библиотека шаблонов была бы полным излишеством функций, которые на самом деле не нужны для этой простой вещи! ;)   -  person Max Malberg    schedule 06.12.2012
comment
есть несколько довольно легких библиотек шаблонов. И имейте в виду, что одной из самых больших проблем с такого рода вещами является безопасность. Создание собственной системы шаблонов с большой долей вероятности может привести к XSS-уязвимостям.   -  person SDC    schedule 06.12.2012