0

在 WordPress 中,我们可以使用以下格式在帖子内容中使用简码功能:

[简码]数据[/简码]

例如:

[简码]Lorem ipsum[/简码] dolor sit amet,consectetur adipiscing elit。Praesent laoreet 发酵菌。Ut molestie purus interdum lacus pharetra placerat。

我的问题是,我们需要替换帖子内容中的任何文本的正则表达式是什么,除了简码中的文本?

4

3 回答 3

2

问题没有说明要替换的文本以及替换的内容。考虑使用此代码来搜索/替换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);

输出

String(100) "<i>foo</i>
 bar[shortcode]foo[/shortcode]<i>foo</i> 123
 bar [shortcode]foo[/shortcode] <i>foo</i>"

如您所见,上面的输出在标记外将搜索文本包含foo在斜体文本中。shortcode

于 2011-05-26T04:13:47.560 回答
0

以下正则表达式将匹配短代码标签之间的所有内容,仅此而已

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

它查找紧随其后的位置[shortcode],然后匹配任何紧随其后的字符串(尽可能短)[/shortcode]

如果你想在 PHP 中打印所有这些中间字符串,你需要这样的代码:

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

如果要在循环外使用捕获的文本,则将该echo $result[0][$i];行替换为:

  • $output .= $result[0][$i];
于 2011-05-26T11:09:33.983 回答
0
s/.*\[shortcode]([^[]*)\[\/shortcode].*/\1/gm
于 2011-05-26T03:27:01.787 回答