Как правило, использование синтаксического регулярного выражения для анализа XML-данных (теги / закрывающие теги / атрибуты) является плохой идеей: некоторый анализатор DOM намного лучше.
Однако для быстрого и грязногоИсправьте вашу проблему, попробуйте:
$text = 'Lorem ipsum .....';
$patterns = array('/\[annotate([^\]]*)\]/',
'/\[\/annotate\]/');
$replacements = array('<span blahablah \1>',
'</span>');
echo preg_replace($patterns, $replace, $text);
$patterns
имеет первый элемент, являющийся открывающим тегом, а последний - закрывающим тегом.Открывающий тег захватывает все после annotate
до соответствующего закрывающего ]
и сохраняет его в replacements
, используя \1
.
Одна из причин, по которой я говорю, что регулярное выражение - не лучшая идея для разбора теговв том, что если annotate
содержит блуждающий ]
, который испортит регулярное выражение.
Например, [annotate extraattribute="alblasd]"]
будет обрезан в первом ]
вместо второго.