正则表达式:获取 BB [代码] 标签之间的代码

RegEx: Get the code between a BB [code] tag

我正在尝试使用 PHP 搜索 [code][php] 标签内的字符串。但是我无法让它工作。在其他 BB 标签上使用相同的正则表达式我可以成功获得匹配但在那些标签上却不行。

到目前为止我有这个:

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

这应该匹配以下内容:

[code]
    this should be matched
[/code]

[php]
    this should be matched
[/php]

我将 preg_replace_callback 与匿名函数一起使用,但该函数不会在这两个标记上被调用。如果我更改正则表达式以匹配其他标签而不是这两个标签,它就会被调用。

你真的不需要做正则表达式。考虑:

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)

取自 answer

您正在使用 .,它匹配除换行符之外的所有字符。将其切换为也匹配换行符的构造,例如 [\s\S],甚至使用标志 /s:

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

我还建议将 [code][/code] 匹配,与 [php][/php] 匹配:

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

在这种情况下,实际代码将在匹配组 2 中。See this Regex 101 for more information