php关于url、文件、目录、ip的相关问题汇总
2015-08-04 09:55
726 查看
php中关于url就会涉及到相当多的问题,无论是查询字串,亦或是文件名或路径,很多时候我们希望特殊处理。下面是个人收集的一些相关问题及答案,可能很简单,但有用!
<?php /* 首先是存在超全局变量$_SERVER的信息,一下只是部分,详情可查看参考手册 url为 http://www.ygytest.com:83/test/urlTest.php?a=123&b=456 文件绝对路径为 E:/php/ygyTest/test/urlTest.php */ echo $_SERVER['PHP_SELF'].'<br>'; //输出/test/urlTest.php,这在页面需要指向自己时非常有用 echo $_SERVER['SCRIPT_NAME'].'<br>'; //输出/test/urlTest.php,这在页面需要指向自己时非常有用 echo $_SERVER['SCRIPT_FILENAME'].'<br>';//输出绝对路径E:/php/ygyTest/test/urlTest.php echo $_SERVER['QUERY_STRING'].'<br>'; //输出a=123&b=456 echo $_SERVER['REMOTE_ADDR'].'<br>'; //本机测试,所以访问该页面的客户端的IP为127.0.0.1 echo $_SERVER['SERVER_ADDR'].'<br>'; //本机测试,服务器地址127.0.0.1 echo $_SERVER['DOCUMENT_ROOT'].'<br>'; //输出E:/php/ygyTest echo $_SERVER['REMOTE_PORT'].'<br>'; //一开始以为是80之类的,结果在火狐上是62007,360上61873,而且每次都不一样 echo $_SERVER['HTTP_REFERER'].'<br>'; //跳到该页面的前一个页面url,这里不存在,产生警告 echo $_SERVER['SERVER_NAME'].'<br>'; //输出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 '<br>'; 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 '<br>'; 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').'<br>'; echo basename('http://www.ygytest.com:83/test/urlTest.php?a=123&b=456').'<br>';//输出urlTest.php?a=123&b=456 echo basename('http://www.ygytest.com:83/test/urlTest.php?a=123&b=456','.php').'<br>';//输出urlTest.php?a=123&b=456 echo basename('http://www.ygytest.com:83/test/urlTest.php','.php').'<br>';//输出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').'<br>'; /* 获取文件扩展名,其实能够处理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').'<br>'; echo get_file_ext2('adc.php').'<br>'; echo get_file_ext3('adc.php').'<br>'; echo get_file_ext4('adc.php').'<br>'; echo get_file_ext5('adc.php').'<br>'; /* 写一个函数,算出两个文件的相对路径 如 $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,感觉不对啊 ?>
相关文章推荐
- laravel框架中widget模糊查询
- laravel框架中注册信息验证
- PHP API中,MYSQL与MYSQLI的持久连接区别
- ThinkPHP的增、删、改、查
- laravel框架中Email邮件配置
- pure-ftp samba
- laravel数据库查询是use方法的使用
- PHPSTORM/IntelliJ IDEA 常用 设置配置优化
- VC 局域网内上传文件 FTP或盘符映射
- PHPStorm下XDebug配置
- java/php/c#版rsa签名以及验签实现
- 本文示例如何使用SAP FTP Function将文件从应用服务器传输到另外一个FTP服务器上。
- 如何用ThinkPHP的Save方法,保存未被修改的数值
- twisted的FTPRealm解读
- yii中find()指定条件
- PHP的正则
- 简单的php分页功能
- PHP合并discuz用户脚本的方法
- PHP魔术方法__set()和__get()的解释001
- 关于php高版本出现警告解决办法