Я строю функцию PHP, которая заменяет «My Term» (для этого примера) в строке, сгенерированной пользователем, на preg_replace, за исключением случаев, когда «My Term» находится внутри тегов шорткода, например:
'Replace My Term here [link attr="ignore My Term here"]ignore My Term here[/link]'
Таким образом, по сути, регулярное выражение должно заменять все экземпляры "My Term" в строке, если они не находятся между "[link" и "[/link]".
Я придумалследующее регулярное выражение, которое соответствует «My Term», когда оно не заключено в буквенно-цифровые символы и когда оно не заключено в квадратные скобки.
preg_replace('~(?<![A-Za-z0-9\]])My Term(?![A-Za-z0-9\[])(?=(?:(?:[^\]]*+\]){2})*+[^\]]*+\z)~', $replacement, $text);
Однако!Это также игнорирует все экземпляры «My Term» между случайными шорткодами, например так:
'[shortcode1] this instance of My Term is ignored when it shouldnt be [shortcode2]'
Как я могу изменить это регулярное выражение, чтобы игнорировать текст, только когда он помещен между заключенными «[link» и «[/ссылка] "теги?