为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 两个字符串的交集(服务器目录路径和url路径)

PHP 两个字符串的交集(服务器目录路径和url路径)

PHP
白衣染霜花 2021-07-01 09:01:06
我有一种情况,我需要找到服务器目录路径和项目所基于的公共路径之间的重叠。$dir = '/server/home/this/directory/to/public/my_app/';$uri = '/my_app/home/script.php';我四处寻找答案并找到了部分解决方案。我可以用'/'分割字符串并创建数组,然后使用array_intersect(),但是我得到了这个......$dir_array = array_filter(explode('/', 'a/e/c/d/'));$url_array = array_filter(explode('/', 'd/e'));print_r( array_intersect($dir_array, $url_array) );// Array ( [1] => e [3] => d )我不想包含“home”文件夹,因为它不在 URI 中。
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

这是我的方法。我还没有测试它是否比@Adam 的更快,但我认为它看起来更干净。


$dir = $_SERVER['SCRIPT_FILENAME'];

$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);


$intersection = implode('/',

    call_user_func_array('array_intersect',

        array_map(function($a) {

            return explode('/', $a);

        },

            [$dir, $uri])

    )

);


$uri_result = substr($request_uri, strlen($intersection));


查看完整回答
反对 回复 2021-07-09
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

所以我想出了一个答案:


$dir_a = array_filter(explode('/', __DIR__));

$url_a = array_filter(explode('/', $uri));

$base_public_folder = '';


foreach ($url_a as $url_key => $url_f) {

    foreach ($dir_a as $dir_key => $dir_f ) {

        $next_url_f = !empty($url_a[($url_key + 1)]) ? $url_a[($url_key + 1)] : '';

        $next_dir_f = !empty($dir_a[($dir_key + 1)]) ? $dir_a[($dir_key + 1)] : '';

        if (

            $url_f == $dir_f &&

            ($next_dir_f == '' || $next_url_f == $next_dir_f)

        ) {

            $base_public_folder .= "/".$url_f;

            break;

        }

    }

}

echo $base_public_folder;

// outputs '/my_app'


查看完整回答
反对 回复 2021-07-09
  • 2 回答
  • 0 关注
  • 250 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信