防止PHP preg_replace替换shortcode标记内的文本

时间:2011-05-26 03:09:14

标签: php regex wordpress preg-replace shortcode

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

  

[短码]数据[/短码]

例如:

  

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

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

3 个答案:

答案 0 :(得分: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标记之外的斜体文本

答案 1 :(得分:0)

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

答案 2 :(得分:0)

以下正则表达式将匹配短代码标记之间的所有内容,而不是其他内容:

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

它会在[shortcode]之后找到位置,然后匹配任何字符串 - 尽可能短 - 在[/shortcode]之前结束。

如果你想在PHP中打印所有这些inbetween-strings,你需要这样的代码:

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];