php pathinfo()与parse_url()函数用法与区别

 更新时间:2016年11月25日 16:47  点击:1805
在php中pathinfo()与parse_url()函数都可以获取url的信息,但是个人感觉这两个函数几乎没有什么共同之处呀,下面我来转一篇关于pathinfo()与parse_url()函数用法

说明
mixed pathinfo ( string $path [, int $options ] )

pathinfo() 返回一个关联数组包含有 path 的信息。包括以下的数组单元:dirname,basename 和 extension。

可以通过参数 options 指定要返回哪些单元。它们包括:PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION。默认是返回全部的单元。如果不是要求取得所有单元,则本函数返回字符串。

 Example #1 pathinfo() 例子

 代码如下 复制代码

<?php
$path_parts = pathinfo(“/www/htdocs/index.html”);
echo $path_parts["dirname"] . ” “;
echo $path_parts["basename"] . ” “;
echo $path_parts["extension"] . ” “;
?>

以上例程会输出:

/www/htdocs
index.html
htmlPHP parse_url 解析 URL,返回其组成部分
parse_url
(PHP 4, PHP 5)

parse_url — 解析 URL,返回其组成部分

说明
array parse_url ( string $url )本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分。不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析。

参数
 

url
要解析的 URL

 

返回值
对严重不合格的 URL,parse_url() 可能会返回 FALSE 并发出 E_WARNING。否则会返回一个关联数组,其组成部分为(至少有一个):

•scheme - 如 http
•host
•port
•user
•pass
•path
•query - 在问号 ? 之后
•fragment - 在散列符号 # 之后
 

范例
Example #1 parse_url() 例子

 代码如下 复制代码

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));
?>

以上例程会输出:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

注释
Note:

本函数不能用于相对 URL。

1

使用dedecms的朋友可能会自己dedecms会记录程序执行错误文件和注入sql到一个日志文件中去,下面我来介绍在php中的一个error_log()将错误信息写入日志文件实例,希望此方法对大家有帮助。

error_log() 是发送错误信息到某个地方的一个函数,在程序编程中比较常见,尤其是在程序调试阶段。

本文将用实例讲解一下error_log()这个函数的用法,以及一些需要注意的问题。

 代码如下 复制代码

<?php 

 $str='这是条错误信息。'; 

 error_log($str,3,'errors.log'); 

 ?>

上述是最常用的error_log()例子,它的作用是把一条信息写入errors.log这个文件里,这个文件如果不存在则自动创建。在这个例子中,我们看到有一个参数“3”,注意这个数字“3”不能更改也不能去掉。

下面列举一下使用error_log()这个函数的过程中可能出现的问题:

(1)程序报错提示:Warning: error_log() [function.error-log]: failed to open stream: Permission denied in ...on line ...

上述错误的出现,是因为文件没有写权限,开启该目录的文件写权限即可。

(3)写入到log文件中的信息不能换行

使用error_log()写入log文件,会发现文字是没有换行的,可以对以上代码做如下改进:

 代码如下 复制代码

<?php 

 $str="这是条错误信息。rn"; 

 error_log($str,3,'errors.log'); 

 ?>

注意$str,用的是双引号(php单引号和双引号的区别),还在字符串结尾加上了rn。这跟第一个实例那个写法是不同的。

下面我再分享两个自定义记录出错日志实例

 

 代码如下 复制代码

<?php
    function exceptionHandler(){
        error_reporting(E_ALL ^ E_NOTICE);
        date_default_timezone_set('Etc/GMT-8');    //设置时区
   
        ini_set('display_errors',0);    //将错误记录到日志
        ini_set('error_log','D:\'.date('Y-m-d').'_weblog.txt');
        ini_set('log_errors',1);    //开启错误日志记录
        ini_set('ignore_repeated_errors',1);    //不重复记录出现在同一个文件中的同一行代码上的错误信息。

        $user_defined_err = error_get_last();
        if($user_defined_err['type'] > 0)
        {
            switch($user_defined_err['type']){
                case 1:
                    $user_defined_errType = '致命的运行时错误(E_ERROR)';
                    break;
                case 2:
                    $user_defined_errType = '非致命的运行时错误(E_WARNING)';
                    break;
                case 4:
                    $user_defined_errType = '编译时语法解析错误(E_PARSE)';
                    break;
                case 8:
                    $user_defined_errType = '运行时提示(E_NOTICE)';
                    break;
                case 16:
                    $user_defined_errType = 'PHP内部错误(E_CORE_ERROR)';
                    break;
                case 32:
                    $user_defined_errType = 'PHP内部警告(E_CORE_WARNING)';
                    break;
                case 64:
                    $user_defined_errType = 'Zend脚本引擎内部错误(E_COMPILE_ERROR)';
                    break;
                case 128:
                    $user_defined_errType = 'Zend脚本引擎内部警告(E_COMPILE_WARNING)';
                    break;
                case 256:
                    $user_defined_errType = '用户自定义错误(E_USER_ERROR)';
                    break;
                case 512:
                    $user_defined_errType = '用户自定义警告(E_USER_WARNING)';
                    break;
                case 1024:
                    $user_defined_errType = '用户自定义提示(E_USER_NOTICE)';
                    break;
                case 2048:
                    $user_defined_errType = '代码提示(E_STRICT)';
                    break;
                case 4096:
                    $user_defined_errType = '可以捕获的致命错误(E_RECOVERABLE_ERROR)';
                    break;
                case 8191:
                    $user_defined_errType = '所有错误警告(E_ALL)';
                    break;
                default:
                    $user_defined_errType = '未知类型';
                    break;
                }
            $msg = sprintf('%s %s %s %s %s',date("Y-m-d H:i:s"),$user_defined_errType,$user_defined_err['message'],$user_defined_err['file'],$user_defined_err['line']);
            error_log($msg,0);
        }
    }

    register_shutdown_function('exceptionHandler');
?>

调用方法

<meta charset="utf-8">
<?php
    //文件2:【test.php】
    include('error.class.php');
    echo $_COOKIE['aaaaadfa'];    //此cookie不存在就会产生一个错误,用来做测试用
    echo $_SESSION['aaaaadfa'];    //此session不存在就会产生一个错误,用来做测试用
?>

例2 日志记录类

 代码如下 复制代码

<?php
/**********************************************************
 * File name: LogsClass.class.php
 * Class name: 日志记录类
 * Create date: 2008/05/14
 * Update date: 2008/09/28
 * Author: blue
 * Description: 日志记录类
 * Example: //设定路径和文件名
 * $dir="a/b/".date("Y/m",time());
 * $filename=date("d",time()).".log";
 * $logs=new Logs($dir,$filename);
 * $logs->setLog("test".time());
 * //使用默认
 * $logs=new Logs();
 * $logs->setLog("test".time());
 * //记录信息数组
 * $logs=new Logs();
 * $arr=array(
 * 'type'=>'info',
 * 'info'=>'test',
 * 'time'=>date("Y-m-d H:i:s",time())
 * );
 * $logs->setLog($arr);
 **********************************************************/
class Logs {
    private $_filepath; //文件路径
    private $_filename; //日志文件名
    private $_filehandle; //文件句柄
   

    /**
     *作用:初始化记录类
     *输入:文件的路径,要写入的文件名
     *输出:无
     */
    public function Logs($dir = null, $filename = null) {
        //默认路径为当前路径
        $this->_filepath = empty ( $dir ) ? '' : $dir;
       
        //默认为以时间+.log的文件文件
        $this->_filename = empty ( $filename ) ? date ( 'Y-m-d', time () ) . '.log' : $filename;
       
        //生成路径字串
        $path = $this->_createPath ( $this->_filepath, $this->_filename );
        //判断是否存在该文件
        if (! $this->_isExist ( $path )) { //不存在
            //没有路径的话,默认为当前目录
            if (! empty ( $this->_filepath )) {
                //创建目录
                if (! $this->_createDir ( $this->_filepath )) { //创建目录不成功的处理
                    die ( "创建目录失败!" );
                }
            }
            //创建文件
            if (! $this->_createLogFile ( $path )) { //创建文件不成功的处理
                die ( "创建文件失败!" );
            }
        }
       
        //生成路径字串
        $path = $this->_createPath ( $this->_filepath, $this->_filename );
        //打开文件
        $this->_filehandle = fopen ( $path, "a+" );
    }
   
    /**
     *作用:写入记录
     *输入:要写入的记录
     *输出:无
     */
    public function setLog($log) {
        //传入的数组记录
        $str = "";
        if (is_array ( $log )) {
            foreach ( $log as $k => $v ) {
                $str .= $k . " : " . $v . "n";
            }
        } else {
            $str = $log . "n";
        }
       
        //写日志
        if (! fwrite ( $this->_filehandle, $str )) { //写日志失败
            die ( "写入日志失败" );
        }
    }
   
    /**
     *作用:判断文件是否存在
     *输入:文件的路径,要写入的文件名
     *输出:true | false
     */
    private function _isExist($path) {
        return file_exists ( $path );
    }
   
    /**
     *作用:创建目录(引用别人超强的代码-_-;;)
     *输入:要创建的目录
     *输出:true | false
     */
    private function _createDir($dir) {
        return is_dir ( $dir ) or ($this->_createDir ( dirname ( $dir ) ) and mkdir ( $dir, 0777 ));
    }
   
    /**
     *作用:创建日志文件
     *输入:要创建的目录
     *输出:true | false
     */
    private function _createLogFile($path) {
        $handle = fopen ( $path, "w" ); //创建文件
        fclose ( $handle );
        return $this->_isExist ( $path );
    }
   
    /**
     *作用:构建路径
     *输入:文件的路径,要写入的文件名
     *输出:构建好的路径字串
     */
    private function _createPath($dir, $filename) {
        if (empty ( $dir )) {
            return $filename;
        } else {
            return $dir . "/" . $filename;
        }
    }
   
    /**
     *功能: 析构函数,释放文件句柄
     *输入: 无
     *输出: 无
     */
    function __destruct() {
        //关闭文件
        fclose ( $this->_filehandle );
    }
}
?>

修正:
1,不用每写一条日志就进行次文件的IO的操作,在对象声明时打开文件句柄
2,支持数组类型的日志记录
3,可使用默认路径和默认文件,为当前目录下的YYYY-MM-DD.log文件

总结

个人更喜欢系统自带的函数,如果系统自带的日志记录函数满足不了我们就可以使用下面自定义函数。

在php中数组去除空值的方法有很多种,一种是直接使用函数array_filter()删除空值,另一种是使用遍历判断为空然后利用unset删除数组。

函数名:array_filter()
调用方式:array_filter($array)
参数说明:$array 是操作的对象,我们将删除其中的空元素

实例:

 代码如下 复制代码

<?php
    $array = ('a' => "abc", 'b' => "bcd",'c' =>"cde",'d' =>"def",'e'=>"");
    array_filter($array);
    echo "<pre>";
    print_r($array);
?>

结果:

Array (

     [a] => abc

     [b] => bcd

     [c] => cde

    [d] => def

   )

foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下:

 代码如下 复制代码

<?php
foreach( $arr as $k=&gt;$v){
if( !$v )
unset( $arr[$k] );
}
>

而且自我感觉还挺不错,只是这样的效率并不高也曾经试过,先将$arr转为对象,然后利用对象的特性来删除,因为:foreach是将当前操作的数组进

行copy,每操作一下foreach,都是copy了一个变量,页面里面如果有太多的foreach,会是一个很大的消耗。

Ctype函数是Php的Ctype扩展函数提供了一组函数用于校验字符串中的字符是否是正确的格式,这篇文章我们主要介绍一下这些字符串验证函数的语法、有什么特殊的函数,如何去验证

Ctype函数是PHP内置的字符串体测函数。主要有以下几种

ctype_alnum -- Check for alphanumeric character(s)
检测是否是只包含[A-Za-z0-9]

ctype_alpha -- Check for alphabetic character(s)
检测是否是只包含[A-Za-z]


ctype_cntrl -- Check for control character(s)
检查是否是只包含类是“nrt”之类的字 符控制字符


ctype_digit -- Check for numeric character(s)
检查时候是只包含数字字符的字符串(0-9)


ctype_graph -- Check for any printable character(s) except space
检查是否是只包含有可以打印出来的字符(除了空格)的字符串


ctype_lower -- Check for lowercase character(s)
检查是否所有的字符都是英文字母,并且都是小写的


ctype_print -- Check for printable character(s)
检查是否是只包含有可以打印出来的字符的字符串


ctype_punct -- Check for any printable character which is not whitespace or an alphanumeric character
检查是否是只包含非数字/字符/空格的可打印出来的字符


ctype_space -- Check for whitespace character(s)
检查是否是只包含类是“ ”之类的字符和空格


ctype_upper -- Check for uppercase character(s)
检查是否所有的字符都是英文字母,并且都是大写的


ctype_xdigit -- Check for character(s) representing a hexadecimal digit
检查是否是16进制的字符串,只能包括 “0123456789abcdef”

如果使用他们

废话不多说直接上代码:

 代码如下 复制代码

<?php
$str1 = 'Azxc1234';//true
$str2 = '123#Axy';//false
if (ctype_alnum($string)) {
    echo "This string totally works";
}
else {
    echo "And this one not so much";
}

注意:如果传第一个空字符串,在php5.1之后是返回 false,但是早期的版本是返回true.

只要确保传递给函数的参数是一个字符串就不会有问题。

 代码如下 复制代码

<?php
$integer = 42;
ctype_digit($integer);         // false
ctype_digit((string)$integer); // true

结论

在使用PHP的过程中,同样的操作可能有不同的方法,选择一个合适的方法显然很重要。在PHP里判断字符串类型的函数有两类,ctype_*和 is_* 他们在实际的应用中 is_*这一系列的函数用的更多一些。当然除了这些办法我们还可以选择使用正则表达式来做判断,而且更强大,但是使用PHP内置的函数可以更好地减少出错率。

empty与isset在php中一个是为空,另一个判断是是否为一个存在的变量了,下面小编来给各位同学介绍php中empty与isset区别,欢迎各位同学进入参考。

empty是判断变量值是非空或非零的值。对应空定义包括:“”(空字符串)、0、“0”、NULL、FALSE、array()和$var(只声明但未赋值)。也就是说当变量值为上述这些,empty返回TRUE,其他的都返回FALSE。

isset是检测变量是否设置,并且不是 NULL。变量设置可以从几个方面来说。1:最简单的就是变量是否先声明和赋值;2:array中是否存在对应的index或key;3:object中是否存在对应的属性。

从上面的两个function定义可以看到,在某些情况下,两者可以公用,但其区别还是很大的。另外它们都只能检测变量,检测任何非变量的东西都将导致解析错误。例如直接检查另一个function的返回值(empty(otherFunction())),你将看到“Fatal error: Can’t use function return value in write context in”这样的错误。

另外isset可以一次检查多个变量,例如:isset($var1, $var2, $var3),当这三个值分别的isset都为TRUE结果为TRUE,否则结果为FALSE。

测试代码:

 代码如下 复制代码

$sep = "<br />";

echo 'test undeclared var empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test undeclared var isset : ';
var_dump(isset($var)); // FALSE

$var;
echo $sep . 'test declared var but no set value empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test declared var but no set value isset : ';
var_dump(isset($var)); // FALSE, 变量申明未赋值,默认值为NULL

$var = NULL;
echo $sep . 'test declared var and set value NULL empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test declared var and set value NULL isset : ';
var_dump(isset($var)); // FALSE, 变量申明赋值为NULL

$var1 = ''; $var2 = '0'; $var3 = 0; $var4 = FALSE; $var5 = array();

echo $sep . 'test '' empty : ';
var_dump(empty($var1)); // TRUE
echo $sep . 'test '0' empty : ';
var_dump(empty($var2)); // TRUE
echo $sep . 'test 0 empty : ';
var_dump(empty($var3)); // TRUE
echo $sep . 'test FALSE empty : ';
var_dump(empty($var4)); // TRUE
echo $sep . 'test array() empty : ';
var_dump(empty($var5)); // TRUE
echo $sep . 'test '', '0', 0, FALSE, array() isset : ';
var_dump(isset($var1, $var2, $var3, $var4, $var5)); // TRUE,  变量申明并赋值为空字符串

输出的结果为:

 代码如下 复制代码

test undeclared var empty : bool(true)
test undeclared var isset : bool(false)
test declared var but no set value empty : bool(true)
test declared var but no set value isset : bool(false)
test declared var and set value NULL empty : bool(true)
test declared var and set value NULL isset : bool(false)
test '' empty : bool(true)
test '0' empty : bool(true)
test 0 empty : bool(true)
test FALSE empty : bool(true)
test array() empty : bool(true)
test '', '0', 0, FALSE, array() isset : bool(true)

比如检测 $id 变量,当 $id=0 时,用empty() 和 isset() 来检测变量 $id 是否已经配置,两都将返回不同的值—— empty() 认为没有配置,isset() 能够取得 $id 的值:

 代码如下 复制代码

 $id=0;
    empty($id)?print "It's empty .":print "It's $id .";
      //结果:It's empty .
    print "<br>";
    !isset($id)?print "It's empty .":print "It's $id .";
      //结果:It's 0 .

   这意味着,我们在使用变量处理函数时,当该变量可能出现0的值,使用 empty() 要小心,这个时候用 isset 取代它更明智一些。

当一个php页面的 URL 尾部参数出现 id=0 时(比如:test.php?id=0),试比较:

 代码如下 复制代码

if(empty($id)) $id=1; - 若 id=0 ,id 也会为1
if(!isset($id)) $id=1; - 若 id=0 ,id 不会为1

可分开运行以下代码检测上述推断:

 代码如下 复制代码

 if(empty($id)) $id=1;
    print $id; // 得到 1

    if(!isset($id)) $id=1;
    print $id; //得到 0

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25