php中常量DIRECTORY_SEPARATOR深入分析

 更新时间:2016年11月25日 15:38  点击:1747
DIRECTORY_SEPARATOR在php是什么意思呢,在什么时候使用DIRECTORY_SEPARATOR最合理呢?下面来给各位介绍一下php DIRECTORY_SEPARATOR常量。

我们知道DIRECTORY_SEPARATOR是一个PHP常量,代表反斜杠,因为windows系统和linux系统的反斜杠不一样。在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符,在linux上路径的分隔符是”/”。

那么在PHP代码中什么时候要用DIRECTORY_SEPARATOR代表反斜杠呢?

比如这句话:

 代码如下 复制代码

require_once dirname(__FILE__).DIRECTORY_SEPARATOR . './../../../wp-config.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'inc/options.php';

这两句PHP代码,为什么前面部分用DIRECTORY_SEPARATOR,而后面部分却用“/”呢
众所周知,windows下的是\和/,而LINUX下的是/

在程序本地运行很正常,上传到服务器后,发现图片没有显示出来,图片链接是绝对路径 var/,而且当中带有 \ 但是我记得这个路径已经处理成相对路径的

 代码如下 复制代码
            $path    = dirname(dirname(dirname(__FILE__))).'\\';
            $search = array( $path, '\\');
            $replace = array( '', '/');
            return str_replace($search,$replace,$this->tempfolder).$this->filename_prefix.$public.'.jpg';

可以各位也看出来了,第一行代码的用在LINUX “\\”, 就不行。

解决的办法是 用PHP 预定义常量DIRECTORY_SEPARATOR来代替'\','/'这样的路径分隔符,以前觉得既然windows,LINUX 都支持/,那都用成 / 得了,这是没错的。可是从这个例子可以看出,当要对路径字符串进行处理的时候,就比较危险了,所以最好还是用DIRECTORY_SEPARATOR吧

最近的工作中经常要用到把内容中的img标签的src属性值(图片地址)读出,由于属性值没有什么规律,所以用正则表达试是个不错的办法,下面我们用php和js分别做实例分享。

要匹配的字符串:
<img src=image/ad1.gif width="128" height="36"/><img src='image/ad2.gif' width="128" height="36" />
正则表达式:
<img[s]+src[s]*=[s]*((['"](?<src>[^'"]*)['"])|(?<src>[^s]*))
正则匹配输出结果:
x
image/ad1.gif
image/ad2.gif
PHP正则提取或 img 元素的 src 属性值:

 代码如下 复制代码
<?php
/*PHP正则提取图片img标记中的任意属性*/
$str = '<center><img src="/uploads/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更改图片img标记中的任意属性</center>';
//1、取整个图片代码
preg_match('/<s*imgs+[^>]*?srcs*=s*('|")(.*?)1[^>]*?/?s*>/i',$str,$match); echo $match[0];
//2、取width
preg_match('/<img.+(width="?d*"?).+>/i',$str,$match); echo $match[1];
//3、取height
preg_match('/<img.+(height="?d*"?).+>/i',$str,$match); echo $match[1];
//4、取src
preg_match('/<img.+src="?(.+.(jpg|gif|bmp|bnp|png))"?.+>/i',$str,$match); echo $match[1];
/*PHP正则替换图片img标记中的任意属性*/ //1、将src="/uploads/images/20100516000.jpg"替换为src="/uploads/uc/images/20100516000.jpg")
print preg_replace('/(<img.+src="?.+)(images/)(.+.(jpg|gif|bmp|bnp|png)"?.+>)/i',"${1}uc/images/${3}",$str); echo "<hr/>";
//2、将src="/uploads/images/20100516000.jpg"替换为src="/uploads/uc/images/20100516000.jpg",并省去宽和高
print preg_replace('/(<img).+(src="?.+)images/(.+.(jpg|gif|bmp|bnp|png)"?).+>/i',"${1} ${2}uc/images/${3}>",$str);
?>



Js正则表达式提取图片地址

 代码如下 复制代码
//正则表达式
<script language="javascript">
var a='<P><IMG src="http://bbs.cn.yimg.com/user_img/200701/31/jisuanji986_117025184198149.jpg" mce_src="http://bbs.cn.yimg.com/user_img/200701/31/jisuanji986_117025184198149.jpg"></P>'
var b=/<IMG src="([^"]*?)">/gi
var s=a.match(b)
for(var i= 0;i<s.length;i++)
{
alert(s[i]);
alert(RegExp.$1)
}
</script>
php中有很多自带的随机函数这些函数可以生成随机的但多次之后可能会重复,下面整理了一些 产生不重复随机数的函数。

无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地。在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下(ps:方法1、4、5是我常用的,其余来自网络整理)

方法一:

 代码如下 复制代码
<?php
$numbers = range (1,50);
//shuffle 将数组顺序随即打乱
shuffle ($numbers);
//array_slice 取该数组中的某一段
$num=6;
$result = array_slice($numbers,0,$num);
print_r($result);
?>

 

方法二:

 代码如下 复制代码
<?php
$numbers = range (1,20);
//播下随机数发生器种子,可有可无,测试后对结果没有影响
srand ((float)microtime()*1000000);
shuffle ($numbers);
//跳过list第一个值(保存的是索引)
while (list(, $number) = each ($numbers)) {
echo "$number ";
}
?>

 

方法三:

 代码如下 复制代码
<?php
function NoRand($begin=0,$end=20,$limit=5){
$rand_array=range($begin,$end);
shuffle($rand_array);//调用现成的数组随机排列函数
return array_slice($rand_array,0,$limit);//截取前$limit个
}
print_r(NoRand());
?>

 

上述可以在1-20间随机产生5个不重复的值

方法四:

 代码如下 复制代码
<?php
$tmp=array();
while(count($tmp)<5){
$tmp[]=mt_rand(1,20);
$tmp=array_unique($tmp);
}
print_r($tmp);
?>

 

方法五:

 代码如下 复制代码

<?php
$tmp = range(1,30);
print_r(array_rand($tmp,10));
?>
 

这个可能是比叫简单的了(ps:如果在range中指定了步长,就必须注意array_rand的第二个参数是否超出$tmp的长度)。

PHP提供非常丰富的数组函数,产生随机数大多可以从数组这个角度出发,若你还有方法提供,欢迎给出,文章将持续更新。

php引用是一个很有学问的东西了,下文我们来介绍php引用返回function & fun();学习笔记,希望例子可以帮助到各位。

例子

 代码如下 复制代码

<?php
    class talker{

        private $data = 'Hi';

        public function & get(){
            return $this->data;
        }
      
        public function out(){
            echo $this->data;
        }  

    }

    $aa = new talker();
    $d = &$aa->get();

    $aa->out();
    $d = 'How';
    $aa->out();
    $d = 'Are';
    $aa->out();
    $d = 'You';
    $aa->out();
//the output is "HiHowAreYou"
?>

例子二:

 代码如下 复制代码

<?php
class person{
private $name;
function & getName(){
return $this->name;
}
}

$p = new person();
//注person类中的getName无论前面加不加& 在此调用都不会报错;只不过这样调用没有任何意义
$name = & $p->getName();
$name = 'walker';
$name = $p->getName();
echo $name;//输出walker


补充:函数的引用返回

 代码如下 复制代码

<?php
function &test()
{
    static $b=0;//申明一个静态变量
    $b=$b+1;
    echo $b;
    return $b;
}

$a=test();//这条语句会输出 $b的值 为1
$a=5;
$a=test();//这条语句会输出 $b的值 为2

$a=&test();//这条语句会输出 $b的值 为3
$a=5;
$a=test();//这条语句会输出 $b的值 为6
?>

下面解释下: 

通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定
PHP规定通过$a=&test(); 方式得到的才是函数的引用返回
至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂

用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&$b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
$a=&test();
$a=5;
以后,$b的值变为了5

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中

另附一个php官方例子:

 代码如下 复制代码

This is the way how we use pointer to access variable inside the class.

<?php
class talker{

    private $data = 'Hi';

    public function & get(){
        return $this->data;
    }
  
    public function out(){
        echo $this->data;
    }  

}

$aa = new talker();
$d = &$aa->get();

$aa->out();
$d = 'How';
$aa->out();
$d = 'Are';
$aa->out();
$d = 'You';
$aa->out();
?>

the output is "HiHowAreYou"

在开发中验证邮箱、url、数字是我们常用的一些例子,下面整理了两个不同站长写的验证邮箱、url、数字程序,大家有兴趣可参考一下。

例子

 代码如下 复制代码

public static function isEmail( $email )

{

return preg_match("/^([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,4}([\.][a-z]{2})?$/i" , $email  );
}

public static function isNumber( $num )
{
return is_numeric( $num );
}

public static function isUrl( $url , $preg = false )
{
if( $preg )
{
$status = preg_match ( "/^([^:\/\/])+\:\/\/[\w-]+\.[\w-.\?\/]+$/" , $url );
}
else
{
$status =  filter_var( $url , FILTER_VALIDATE_URL );
}

return $status;
}

补充:利用php自带函数来操作。

php验证邮箱

 代码如下 复制代码

<?php
$email = 'fengdingbo@gmail.com';                                               
$result = filter_var($email, FILTER_VALIDATE_EMAIL);
var_dump($result); // string(20) "fengdingbo@gmail.com"

php验证url地址

 代码如下 复制代码

<?php
$url = "http://www.111cn.net";
$result = filter_var($url, FILTER_VALIDATE_URL);
var_dump($result); // string(25) "http://www.111cn.net"

php验证ip地址

 代码如下 复制代码

<?php
$url = "192.168.1.110";                                                        
$result = filter_var($url, FILTER_VALIDATE_IP);
var_dump($result); // string(13) "192.168.1.110"
// 该方法也可以用来验证ipv6。
$url = "2001:DB8:2de::e13";                                                    
$result = filter_var($url, FILTER_VALIDATE_IP);
var_dump($result); // string(17) "2001:DB8:2de::e13"

[!--infotagslink--]

相关文章

  • 解决:failed to open stream: No such file or directory in

    本教程来给各位同学介绍failed to open stream: No such file or directory in解决办法,有需要了解的朋友可进入参考。 Warning: include_once(./include/main.i...2016-11-25
  • MYSQL事务回滚的2个问题分析

    因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
  • Mysql索引会失效的几种情况分析

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 ...2014-06-07
  • 在IDEA使用中directory和package的操作

    这篇文章主要介绍了在IDEA使用中directory和package的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-13
  • python 爬取京东指定商品评论并进行情感分析

    本文主要讲述了利用Python网络爬虫对指定京东商城中指定商品下的用户评论进行爬取,对数据预处理操作后进行文本情感分析,感兴趣的朋友可以了解下...2021-05-28
  • Underscore源码分析

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
  • Google会不会取消PR的理由分析

    Google是这样介绍PageRank的:   Google 出类拔萃的地方在于专注开发“完美的搜索引擎”,联合创始人拉里&middot;佩奇将这种搜索引擎定义为可“确解用户...2017-07-06
  • Fatal error: Cannot redeclare class 原因分析与解决办法

    我使用的都是php __autoload状态自动加载类的,今天好好的程序不知道怎么在运行时提示Fatal error: Cannot redeclare class 了,看是重复定义了类,下面我来分析一下解决办...2016-11-25
  • 关于PHP文件包含一些漏洞分析

    文章简单的分析了在php文件包含时inlcude的一个漏洞分析,下面希望对大家有点用处哦。 基本的文件包含漏洞: 代码如下 复制代码 <?php include...2016-11-25
  • php echo print print_r三者区别分析

    php教程 echo print print_r三者区别分析 echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) print() 只能打印出简单类型变量的...2016-11-25
  • www.111cn.net 排名大跌分析降权原因

    我的主题爱这个站以前排名非常好,后来由于自己操作不当至今还没恢复到以后的那种好的排名,希望各位站长吸取点教训哦。 下面以我们http://www.111cn.net 为例吧,做SE...2016-10-10
  • PHP静态分析与跨站脚本检测

    最近在看PHP静态分析与跨站脚本检测的东西,用的是维也纳大学一个博士生做出来的Pixy,这个东西是开源的,而且也作了好几年了,功能逐渐增强。现在这个3.0.3版本里...2016-11-25
  • 关于web注册页的可用性分析

      在Nielsen的可用性工程里提到可用性的其中一个原则是Errors,记得刚开博客的时候也穷举了一些关于可用性方面的文章,里面将这个errors翻译成了“少错”,实际上...2016-09-20
  • PHP session并发及session读写锁分析

    关于PHP session并发及session读写锁问题估计各大程序员都不会想到这个问题,因为一般情况我们不会使用session来做并发操作了,但有时也有可能用到,下面整理一个session并...2016-11-25
  • WIN2008 R2 Active Directory 之二 部署企业中Windows Server 2008 R2额外域控制器

    通过部署企业中第一台Windows Server 2008 R2域控制器已经完成了企业中Windows网络域森林的建立。但是,在企业中对于AD来讲,为了保证安全稳定运行,至少需要两台以上的物理域控制器...2016-01-27
  • 深入分析PHP const与define使用区别

    const是用于类成员常量的定义了,定义之后不可改,而define我们定义的是全局常量了, 这样我们在其它地方访问但不能改变了,具体还有一些细节我们下面给各位列出来吧 注...2016-11-25
  • 最短的IE判断var ie=!-[1,]分析

    以前最短的IE判定借助于IE不支持垂直制表符的特性搞出来的。 复制代码 代码如下: var ie = !+"/v1"; 仅仅需要7bytes!参见这篇文章,《32 bytes, ehr ... 9, ehr ... 7!!! to know if your browser is IE》,讲述外国人是...2014-05-31
  • Python光学仿真数值分析求解波动方程绘制波包变化图

    这篇文章主要为大家介绍了Python光学仿真通过数值分析求解波动方程并绘制波包变化图的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-10-20
  • 网站快照缓慢的原因分析

    先来看看我在网上搜索到别人说的不更新的一些原因:   1、内容质量不行,对于本博来说百分之九十以上的原创,或者您也可以说是伪原创吧,因为有些理论知识点网上存在很多,只...2016-10-10
  • PHP SQL 注入攻击预防办法与注入分析

    1. php教程 配置文件 php.ini 中的 magic_quotes_gpc 选项没有打开,被置为 off 2. 开发者没有对数据类型进行检查和转义 不过事实上,第二点最为重要。我认为, 对用户输入...2016-11-25