我正在尝试使用PHP对[code]
和[php]
标记内的字符串进行搜索。但是,我无法让它工作。在其他BB标签上使用相同的正则表达式,我可以成功获得匹配,但不能在这些标签上。
到目前为止,我有这个:
\[(?:code|php)\](.+?)\[\/(?:code|php)\]
这应符合以下内容:
[code]
this should be matched
[/code]
[php]
this should be matched
[/php]
我正在使用带有匿名函数的preg_replace_callback
,但是不会在这两个标记上调用该函数。如果我改变正则表达式以匹配其他标签而不是那两个标签,则会调用它。
答案 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