Я пытаюсь использовать PHP для поиска строк внутри [code]
а также [php]
теги. Однако я не могу заставить это работать. Используя такое же регулярное выражение для других тегов BB, я могу успешно найти совпадение, но не для этих тегов.
У меня есть это до сих пор:
\[(?:code|php)\](.+?)\[\/(?:code|php)\]
Это должно соответствовать следующему содержанию:
[code]
this should be matched
[/code]
[php]
this should be matched
[/php]
я использую preg_replace_callback
с анонимной функцией, но функция не вызывается на этих двух тегах. Он вызывается, если я изменяю регулярное выражение для соответствия другим тегам, но не этим двум.
Вы используете .
, который соответствует всем символам кроме новой строки. Переключите его на конструкцию, которая также соответствует символу новой строки, например [\s\S]
или даже использовать флаг /s
:
\[(?:code|php)\]([\s\S]+?)\[\/(?:code|php)\]
~\[(?:code|php)\](.+?)\[\/(?:code|php)\]~s
Я также рекомендовал бы соответствие [code]
с [/code]
и то же самое с [php]
а также [/php]
:
\[(code|php)\]([\s\S]+?)\[\/\1\]
В этом случае фактический код будет в группе совпадений 2. Смотрите это Regex 101 для получения дополнительной информации.
Вам не нужно делать регулярные выражения. Рассматривать:
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)
взяты из ответ