Вопрос не говорит о том, какой текст заменить и чем. Рассмотрим этот код для поиска / замены некоторого шаблона вне тега shortcode
.
Цель: Курсивом каждый случай foo
, но не внутри shortcode
тега.
$str = "foo
bar[shortcode]foo[/shortcode]foo 123
bar [shortcode]foo[/shortcode] foo"; // post content
$query = "foo"; // search pattern
$query = preg_quote($query, '~');
$p = '~((\[shortcode\])(?(2).*?\[/shortcode\])(?:.*?))*?(' . $query . ')~smi';
$s = preg_replace($p, "$1<i>$3</i>", $str);
var_dump($s);
OUTPUT
String(100) "<i>foo</i>
bar[shortcode]foo[/shortcode]<i>foo</i> 123
bar [shortcode]foo[/shortcode] <i>foo</i>"
Как вы можете видеть выше, вывод заключает искомый текст foo
в выделенный курсивом текст ONLY вне тега shortcode
.