Запрет PHP preg_replace для замены текста внутри тега шорткода - PullRequest
0 голосов
/ 26 мая 2011

В WordPress мы можем использовать функцию шорткода внутри содержимого публикации, используя этот формат:

[шорткод] data [/ shortcode]

, например:

[шорткод] Lorem ipsum [/ шорткод] долор сит амет, ведущий адептирующий элит.Praesent Laoreet Fermentum Lacinia.Ut molestie purus interdum lacus pharetra placerat.

Мой вопрос: каково регулярное выражение, в котором нам нужно заменить любой текст внутри содержимого сообщения, кроме того, что внутри шорткода?

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Вопрос не говорит о том, какой текст заменить и чем. Рассмотрим этот код для поиска / замены некоторого шаблона вне тега 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.

0 голосов
/ 26 мая 2011

Следующее регулярное выражение будет соответствовать всему, что находится между шорткодом тегами и ничем иным:

  • (?<=\[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];
0 голосов
/ 26 мая 2011
s/.*\[shortcode]([^[]*)\[\/shortcode].*/\1/gm
...