您的位置:首页 > 编程语言 > PHP开发

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,感觉不对啊
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: