dir_recurse是 php函数,php关于url、文件、目录、ip的相关问题汇总

php中关于url就会涉及到相当多的问题,无论是查询字串,亦或是文件名或路径,很多时候我们希望特殊处理。下面是个人收集的一些相关问题及答案,可能很简单,但有用!

/*

首先是存在超全局变量$_SERVER的信息,一下只是部分,详情可查看参考手册

url为http://www.ygytest.com:83/test/urlTest.php?a=123&b=456

文件绝对路径为E:/php/ygyTest/test/urlTest.php

*/

echo $_SERVER['PHP_SELF'].'
'; //输出/test/urlTest.php,这在页面需要指向自己时非常有用

echo $_SERVER['SCRIPT_NAME'].'
'; //输出/test/urlTest.php,这在页面需要指向自己时非常有用

echo $_SERVER['SCRIPT_FILENAME'].'
';//输出绝对路径E:/php/ygyTest/test/urlTest.php

echo $_SERVER['QUERY_STRING'].'
'; //输出a=123&b=456

echo $_SERVER['REMOTE_ADDR'].'
'; //本机测试,所以访问该页面的客户端的IP为127.0.0.1

echo $_SERVER['SERVER_ADDR'].'
'; //本机测试,服务器地址127.0.0.1

echo $_SERVER['DOCUMENT_ROOT'].'
'; //输出E:/php/ygyTest

echo $_SERVER['REMOTE_PORT'].'
'; //一开始以为是80之类的,结果在火狐上是62007,360上61873,而且每次都不一样

echo $_SERVER['HTTP_REFERER'].'
'; //跳到该页面的前一个页面url,这里不存在,产生警告

echo $_SERVER['SERVER_NAME'].'
'; //输出www.ygytest.com

/*

写一个函数,遍历文件夹下的所有文件及子文件夹

相关基础知识:

is_dir($dir):判断是否是文件夹

dir($dir):返回一个 Directory 类实例,以面向对象的方式访问目录常用read()和close()方法

$handle = opendir($dir):打开目录,返回句柄

readdir($handle):读目录,可用于遍历目录下的文件和文件夹

rewinddir($handle):重置到目录开头

closedir($handle):关掉目录句柄

问题解决:

在遍历过程中有得到以单点和双点的文件名,事实上目录下没有这些文件,也不是隐藏文件。只能猜是php的问题了,单点.应该表示当前目录,双点..应该表示上一级目录,而我们不需要,可以在遍历时做判断。

出现 Fatal error: Maximum execution time of 30 seconds exceeded错误。大概意思就是访问时间超过php.ini中设定的30秒。原因是在遍历时没有加单点.和双点..的判断,造成递归的无穷尽,这也进一步验证了这里出现的单点.是指当前目录,双点..是指上一级目录。

*/

function dir_scan($dir){//子文件在是否非空时,不作处理。

if(is_dir($dir)){

$files=array();

$d = dir($dir);

while (false !== ($file = $d->read())){

$files[]= $file;

}

$d->close();

return $files;

}else{

return false;

}

}

print_r(dir_scan($_SERVER['DOCUMENT_ROOT']));

echo '
';

function dir_recurse($dir){//子文件在是否非空时,递归处理。

if(is_dir($dir)){

$files=array();

$d = dir($dir);

while (false !== ($file = $d->read())){

if($file !='.' && $file !='..'){//对.当前目录和..上一级目录进行判断

if (is_dir($dir."/".$file)){

$files[] = dir_recurse($dir.'/'.$file);

}else{

$files[]= $file;

}

}

}

$d->close();

return $files;

}

}

print_r(dir_recurse($_SERVER['DOCUMENT_ROOT']));

echo '
';

function dir_recurse2($dir){//非面向对象方法

$files= array();

if($handle = opendir($dir)){

while(($file = readdir($handle))!==false){

if($file !='.' && $file !='..'){

if (is_dir($dir.'/'.$file)){

$files[$file] = dir_recurse2($dir.'/'.$file);

}else{

$files[]= $file;

}

}

}

closedir($handle);

return $files;

}

}

/*

从url中获取文件扩展名

基础知识;

basename($path,$ext):返回路径中文件部分,参数2可有可无,可去掉扩展名部分,如果是url中带有参数则该参数没用啊

parse_url($url):解析url返回url中各个组成部分的关联数组,对严重不合格的url可能会返回false

explode($str,$ostr):以字符串分割字符串,返回分割后的数组

strpos — 查找字符串首次出现的位置,返回数字

strstr-- 查找字符串首次出现的位置,返回之前的字串或之后的字串,如果只是想知道存不存在某个字串,用strpos更高效

*/

function get_ext1($url){

$arr = parse_url($url);

$file = basename($arr['path']);

$ext = explode('.',$file);

return $ext[1];

}

echo get_ext1('http://www.ygytest.com:83/test/urlTest.php?a=123&b=456').'
';

echo basename('http://www.ygytest.com:83/test/urlTest.php?a=123&b=456').'
';//输出urlTest.php?a=123&b=456

echo basename('http://www.ygytest.com:83/test/urlTest.php?a=123&b=456','.php').'
';//输出urlTest.php?a=123&b=456

echo basename('http://www.ygytest.com:83/test/urlTest.php','.php').'
';//输出urlTest

function get_ext2($url){

$url = basename($url);

$pos1 = strpos($url,'.');

$pos2 = strpos($url,'?');

if(strstr($url,"?")){

return substr($url,$pos1+1,$pos2-$pos1-1);

}else{

return substr($url,$pos1);

}

}

echo get_ext2('http://www.ygytest.com:83/test/urlTest.php?a=123&b=456').'
';

/*

获取文件扩展名,其实能够处理url,这个应该就不难

基础知识;

strrchr — 查找指定字符在字符串中的最后一次出现,返回出现位置到字串最后的子字串

array_pop — 将数组最后一个单元弹出(出栈)

pathinfo - 返回一个关联数组包含有 path 的信息。

*/

//1)

function get_file_ext1($file_name){

return strrchr($file_name, '.');

}

//2)

function get_file_ext2($file_name){

return substr($file_name, strrpos($file_name, '.'));

}

//3)

function get_file_ext3($file_name){

return array_pop(explode('.', $file_name));

}

//4)

function get_file_ext4($file_name){

$p = pathinfo($file_name);

return $p['extension'];

}

//5)

function get_file_ext5($file_name){

return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));

}

echo get_file_ext1('adc.php').'
';

echo get_file_ext2('adc.php').'
';

echo get_file_ext3('adc.php').'
';

echo get_file_ext4('adc.php').'
';

echo get_file_ext5('adc.php').'
';

/*

写一个函数,算出两个文件的相对路径 如 $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php';

计算出 $b 相对于 $a 的相对路径应该是 ../../c/d

没太弄懂,留着吧

基础知识:

dirname--给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。

realpath — 返回规范化的绝对路径名

*/

function getRelativePath($a, $b) {

$returnPath = array(dirname($b));

$arrA = explode('/', $a);

$arrB = explode('/', $returnPath[0]);

for ($n = 1, $len = count($arrB); $n < $len; $n++) {

if ($arrA[$n] != $arrB[$n]) {

break;

}

}

if ($len - $n > 0) {

$returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..'));

}

$returnPath = array_merge($returnPath, array_slice($arrA, $n));

return implode('/', $returnPath);

}

echo getRelativePath('/a/b/c/d/e.php','/a/b/12/34/c.php');//输出/a/b/12/34/../../c/d/e.php,感觉不对啊

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值