Как разобрать псевдокод похожий на 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;
}