переменная длина Двойник за не поддерживается в PHP, так что эта часть вашего шаблона не является действительной:
(?<!\[caption.*\])
Следует предупреждают об этом.
Кроме того, .*
всегда соответствует наибольшей возможной сумме. Таким образом, ваш шаблон может привести к совпадению, которое перекрывает несколько тегов. Вместо этого используйте [^>]
(сопоставьте все, что не является закрывающей скобкой), поскольку закрывающие скобки не должны встречаться внутри тега img
.
Чтобы решить проблему с внешним видом, почему бы не просто проверить только закрывающий тег? Этого должно быть достаточно (предполагая, что теги субтитров используются только так, как показано на рисунке).
$pattern = '|(<a[^>]*><img[^>]*></a>)(?!\[/caption\])|';
При сопоставлении шаблонов, которые содержат /
, использовать другой символ в качестве разделителя шаблона, чтобы избежать опираясь синдромом зубочистки. Вы можете использовать почти любой алфавитно-цифровой символ вокруг шаблона.
Обновление: Предыдущее регулярное выражение основано на примере регулярного выражения, которое вы указали, а не на примере данных. Если вы хотите, чтобы соответствовать ссылкам, которые не содержат изображения, сделайте следующее:
$pattern = '|(<a[^>]*>[^<]*</a>)(?!\[/caption\])|';
Обратите внимание, что это не позволяет любых тегов в середине линии. Если вы разрешаете теги (например, используя .*?
), регулярное выражение может соответствовать чему-то, начиная с [caption]
и заканчивая в другом месте.
Почему вы не пытаетесь сопоставить строки, начинающиеся с palindrom