RegEx: Получить код между тегом BB [code]

Я пытаюсь использовать PHP для поиска строк внутри [code] а также [php] теги. Однако я не могу заставить это работать. Используя такое же регулярное выражение для других тегов BB, я могу успешно найти совпадение, но не для этих тегов.

У меня есть это до сих пор:

\[(?:code|php)\](.+?)\[\/(?:code|php)\]

Это должно соответствовать следующему содержанию:

[code]
this should be matched
[/code]

[php]
this should be matched
[/php]

я использую preg_replace_callback с анонимной функцией, но функция не вызывается на этих двух тегах. Он вызывается, если я изменяю регулярное выражение для соответствия другим тегам, но не этим двум.

-2

Решение

Вы используете ., который соответствует всем символам кроме новой строки. Переключите его на конструкцию, которая также соответствует символу новой строки, например [\s\S]или даже использовать флаг /s:

\[(?:code|php)\]([\s\S]+?)\[\/(?:code|php)\]
~\[(?:code|php)\](.+?)\[\/(?:code|php)\]~s
1

Другие решения

Я также рекомендовал бы соответствие [code] с [/code] и то же самое с [php] а также [/php]:

\[(code|php)\]([\s\S]+?)\[\/\1\]

В этом случае фактический код будет в группе совпадений 2. Смотрите это Regex 101 для получения дополнительной информации.

1

Вам не нужно делать регулярные выражения. Рассматривать:

function get_string_between($string, $start, $end){
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}

$fullstring = "this is my [tag]dog[/tag]";
$parsed = get_string_between($fullstring, "[tag]", "[/tag]");

echo $parsed; // (result = dog)

взяты из ответ

0
По вопросам рекламы [email protected]