Preg_replace Regex, который игнорирует вложенные шорткоды Wordpress - PullRequest
0 голосов
/ 07 марта 2019

Я строю функцию 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» и «[/ссылка] "теги?

1 Ответ

0 голосов
/ 07 марта 2019

Хорошо, оказалось, что я использовал совершенно неправильный подход, используя обходные пути для одинарных скобок.

Мое текущее регулярное выражение

'~(?<![A-Za-z0-9\]"])My Term(?![A-Za-z0-9\["])(?!(.(?!\[link))*\[/link\])~'

делает именно то, что мне было нужно: preg_replace теперь игнорирует «Мой термин» между тегами [link] и когда он находится рядом с кавычкой, но не между другими случайными шорткодами.

...