RegEx:获取BB [code]标签之间的代码

时间:2015-02-11 04:08:04

标签: php regex match

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

到目前为止,我有这个:

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

这应符合以下内容:

[code]
    this should be matched
[/code]

[php]
    this should be matched
[/php]

我正在使用带有匿名函数的preg_replace_callback,但是不会在这两个标记上调用该函数。如果我改变正则表达式以匹配其他标签而不是那两个标签,则会调用它。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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