动态url上的preg_match


preg_match on dynamic url

php中有没有办法在下面这样的url上进行preg_match

dynamic/dynamic/dev/new_mobile/lib

它只会拉出dev/new_mobile,链路也有能力像一样

动态/动态/动态/tst/new_mobile/lib

在上面的例子中,它只会拉出tst/new_mobile。关键是它会抓取lib之前的最后两个目录。你知道怎么做吗?

这里有一个正则表达式,它将获得您想要的部分:

$url = 'dynamic/tst/new_mobile/lib/foo/bar';
if (preg_match('#^(?:.*?/)?([^/]+/[^/]+)/lib(?:/.+)?$#', $url, $matches)) {
    $part = $matches[1];
    var_dump($part); // "tst/new_mobile"
}

这将获得lib目录之前的2个目录,允许之前和之后的任何目录。它还将匹配几个你没有提到是否需要的边缘案例:

tst/new_mobile/lib/foo/bar
/tst/new_mobile/lib/foo/bar

只需分解然后反转数组,简单易用。

$array_url = explode('/',$url);
$tmp_array_url = array_reverse($array_url);

然后你可以随心所欲地重建,不需要怀疑之前有多少动态部件。

echo $tmp_array_url[0]; // "lib";
echo $tmp_array_url[1]; // "new_mobile";
echo $tmp_array_url[2]; // "dev";

编辑:既然你有lib常量,就这样做吧:

$the_two_before = "";
for($i = 0; $i < count($tmp_array_url); $i++){
    if($tmp_array_url[$i] == "lib"){
         $the_two_before = $tmp_array_url[$i+2]."/".$tmp_array_url[$i+1];
    }
}