开发者

Prevent PHP preg_replace to replace text inside shortcode tag

In WordPress we can use shortcode function inside a post content using this format:

[shortcode]data[/shortcode]

for example:

[shortcode]Lorem ipsum[/shortcode] dolor sit amet, consectetur adipiscing elit. Praesent laoreet fermentum lacinia. Ut molestie purus interdum lacus pharetra placerat.

My question is, what is the regular expression that we need to replace any text inside the post content Except the one inside开发者_如何学运维 the shortcode?


Question doesn't say what text to be replaced and by what. Consider this code to do search/replacement of some pattern outside shortcode tag.

Objective: To italicize each occurrence of foo but not inside shortcode tag.

$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>"

As you can see above output encloses search text foo to italicized text ONLY outside the shortcode tag.


s/.*\[shortcode]([^[]*)\[\/shortcode].*/\1/gm


The following regex will match everything that is in-between shortcode tags, and nothing else:

  • (?<=\[shortcode]).*?(?=\[/shortcode])

It looks for positions right after [shortcode], then matches any string -- as short as possible -- that ends right before [/shortcode].

If you want to print all these inbetween-strings in PHP, you need code like this:

preg_match_all('%(?<=\[shortcode\]).*?(?=\[/shortcode\])%s',
                               $input, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
    echo $result[0][$i];
}

If you want to use the caught text outside the loop, then replace the echo $result[0][$i]; line with:

  • $output .= $result[0][$i];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜