PHP regex находит BBCode, который не окружен другим BBCode

Я использую следующее регулярное выражение для поиска bb-кодов IMG и их содержимого в сообщениях на форуме:

~\[img(?:=[\'"]?([^,]*?)(?:,[^]\'"]+)?[\'"]?)?]([^\[]+)?\[/img]~i

Пока это работает, но мне нужно определить исключения. Я должен найти все bb-коды IMG, которые НЕ окружены b-кодом TT- или CODE. Я не пытаюсь разобрать BBCodes (потому что это делается самим программным обеспечением форума).

Итак, я хочу, чтобы IMG bbcode отсюда (который работает, используя регулярное выражение выше):

Hello, this is an example: [img]xxx[/img] - Yay!

но не оттуда

[tt]this is a test [img]xxx[/img] yolo![/tt]

а не отсюда

[code=php]<?php
echo '[img=xxx][/img]';[/code]

Есть идеи, как этого добиться? Я использую PHP (на всякий случай, решение с использованием регулярных выражений невозможно).

0

Решение

Вы можете использовать этот шаблон против второго подшаблон для вашего матча

\[((?:(?!img).)*?)\](?:.*?)\[\/\1\]|\[img.*\](.*?)\[\/img\]

http://regex101.com/r/tF1tX3/2

1

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

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