Как разобрать псевдокод похожий на BBCode в PHP?

Я работаю с файлами шаблонов, которые содержат такие строки:

[field name="main_div" type='smallblock' required="yes"]
[field type='bigblock' color="red" name="inner_div"]
[field name="btn" type='button' caption='Submit']

смешанный со строками HTML.

Это псевдокод для генерации HTML-кода в соответствии со значениями атрибутов.

У меня ограниченный набор атрибутов, но я не контролирую их порядок в строке и наличие всех из них. Иногда устанавливается атрибут "required", иногда, например, отсутствует.

Какой самый простой и удобный способ разбора таких строк, чтобы я мог работать с атрибутами как ассоциативный массив?

Регулярное выражение, конечный автомат, получить подстроку из [в], взорваться в пространстве и взорваться знаком равенства?

Ищете совет или простой кусок кода, который может работать с предоставленным примером.

1 ответ

Решение

Регулярное выражениес. Хотя вы могли бы написать парсер для подобных схем, он излишний и не обеспечивает устойчивости к искаженным токенам.

Хитрость заключается в том, чтобы использовать два регулярных выражения, одно для нахождения [field] жетоны и секунды, чтобы разделить атрибуты.

preg_replace_callback('/\[(\w+)(\s+\w+=\pP[^"\']*\pP)*\]/', "block", $);

function block($match) {

    $field = $match[1];

    preg_match_all('/(\w+)=\pP([^"\']+)\pP/', $match[2], $attr);
    $attr = array_combine($attr[1], $attr[2]);

    // ...
    return $html;
}
Другие вопросы по тегам