Шорткоды / BBcode регулярное выражение

У меня проблема с написанием правильного регулярного выражения.

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

Вот как я готовлю регулярное выражение:

$attributes_regexp = "([^\]]*?)";
$inner_content_regexp = "(.*?)";
$flags_regexp = "im";
$regexp = "/\[$shortcode$attributes_regexp\]$inner_content_regexp\[\/$shortcode\]/$flags_regexp";
preg_match_all($regexp, $content, $found_occurrences);

Вот как выглядит пример готового регулярного выражения:

\[file([^\]]*?)\](.*?)\[\/file\]

И вот немного HTML, который нужно проанализировать:

<div class="row">
<div class="col-md-8">
<h2>Test page</h2>
<p>&nbsp;</p>
<p><strong>Some</strong> content</p>
<p>Lorem ipsum dolor.&nbsp;</p>
<p>Dolor sit amet.</p>
<p>[file id=290 type=link][file id=283 type=image width=100 height=100][/file][/file]</p>
</div>
<div class="col-md-3 offset-md-1">
<p>[file id=289 type=image][/file]</p>
</div>
</div>

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

[идентификатор файла = 290 тип = ссылка][идентификатор файла = 283 тип = ширина изображения = 100 высота = 100][/файл]

Вместо двух отдельных

[идентификатор файла = 283 тип = ширина изображения = 100 высота = 100] [/ файл]

а также

[идентификатор файла = 290 тип = ссылка] [/ файл]

Есть идеи, как это можно отсортировать?

Большое спасибо,
Tomasz

0

Решение

Если данные нарушают только стандарт XML с разделителями тегов [ а также ] вместо < а также > Вы можете превратить данные в XML и использовать XML-парсер для дальнейшего анализа:

$regex = "/(\[{$shortcode}.+\[\/{$shortcode}\])/";
if (preg_match_all($regex, $content, $matches)) {
array_shift($matches); //removes $matches[0], which contains the whole $content again
foreach ($matches as $match) {
//The following line should turn your data into valid XML
$xml = str_replace(['[', ']'], ['<', '>'], $match);
//Some XML parsing like:
$xmlObject = new SimpleXMLElement($xml);
//...
}
}

Таким образом, вам не нужно снова изобретать колесо.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]