二十二、正则表达式
1、PHP提供了两组不同的正则表达式函数:
(1)第一组中包含的是传统的(或POSIX)函数,每个函数的名称都以ereg(意为“扩展”,而且ereg函数本身也是对原始功能集合的一个扩展)作为开头。
(2)另一组中包含的是Perl兼容的函数,函数名都以前缀preg(意为Perl兼容的正则表达式)开头。
(3)一般来说,没有任何理由再使用ereg函数了。因为它们所提供的功能有限,而且比preg函数的速度更慢。
2、匹配举例:
(1)字符类[a-zA-Z0-9]匹配数字、英文字母和下划线。
(2)[a-z0-9]+的描述“一个数字或小写英文字母出现一次或多次”。
(3)^[a-z0-9]+$的含义为“仅包含一个或多个数字或者小写英文字母”。
(4)竖线符号(|),也称为管道(pipe),用于分割二选一的模式。
3、preg_match_all()除了能够返回同时包含完整匹配然后是子匹配的单独数组外,也能按匹配项返回多个带有子匹配项的数组。
输出结果为:
The first action is Get Dressed
The next action is Eat Jelly
The last action is Squash every week into a day
4、在表示数量的元字符后面添加?来修改模式中这一部分的匹配策略,或者以模式修饰符U结尾将所有表示数量的元字符的匹配策略由贪婪(“匹配尽可能多的字符”)转换为非贪婪(“匹配尽可能少的字符”)。虽然非贪婪匹配的思想源于Perl。但U修饰符并不与Prel兼容,它只在PHP的Perl兼容正则表达式中有效。
5、你想在模式中使用圆括号来分组,但不想让与圆括号中的子模式匹配的文本出现在包含匹配文本的数组中,将?:放在紧挨着开始圆括号的后面。
6、preg_quote()转义的元字符:. / + * ? ^ $ [ ] ( ) { } < > = ! | :
quotemeta()转义的元字符:. / + * ? ^ $ [ ] ( )
7、preg_replace_callback()的第二个参数指定的是在计算替换字符串时调用的函数。这个参数可以是一个字符串也可以是一个数组,用字符串之地的那个的是函数名。
二十三、文件
1、由于缓冲的数据在调用fclose()之前可能不会真正写入到磁盘上,所以有时候fclose()也会返回“磁盘已满”的错误。
2、在track_errors配置指令设为on的情况下,每个错误的信息都会被放到全局变量$php_errormsg中。
3、在非POSIX系统中,如Windows系统,当打开二进制文件时需要在模式中添加一个b。即使Unix系统在模式中不加b的情况下能够很好地处理二进制文件,但加上b总是有益的。因为这样就能使你的代码获得更高的可移植性并能够同时在Unix和Windows系统中顺畅运行。
4、当fopen()接收到以http://开头的文件名时,它会以HTTP/1.0 GET请求的方式来取得给定的页面(尽管同时也传递了一个处理虚拟主机的Host:头部信息)。而且通过文件句柄只能访问响应的主体内容,而不能访问头部信息。通过HTTP协议打开文件时,只能读,不能写。
fopen()打开远程文件时通过一个称为流封装(stream wrapper)的PHP特性实现的。这一特性默认是启用的,但通过将php.ini中或Web服务器配置文件中的allow_url_fopen设置为off可以禁用它。
5、PHP提供了两个函数对文件中的内容进行处理:
(1)第一个是fpassthru($fh),这个函数会输出文件句柄$fh中的所有内容,然后再关闭文件句柄。
(2)第二个是readfile($filename),它会直接输出$filename中的全部内容。
6、由于添加HTML标签会使文件体积变大,所以整个文件必须读到内存中进行处理。如果对文件的修改会使每一行收缩(或保持长度不变),该文件就可以被逐行地处理,以节省内存。
7、用escapeshellcmd()处理程序名称。
8、escapeshellarg()要求以单引号引住参数(并对存在于单引号中的任何字符进行转义)。
9、通过flock()可以设定两种锁定方式:排他锁和共享锁。
二十四、目录
1、DirectoryIterator类(在PHP 5及以后版本中有效)提供了一个用于遍历目录的面向对象的综合接口。
2、在Unix系统中,文件权限表示文件的所有者、文件组中的用户以及所有用户能够对文件执行什么操作。操作是指读取、写入和执行。对程序而言,执行意味着运行程序的能力;对目录而言,执行是在目录中搜索文件的能力。
3、当通过chmod()设置权限时,权限必须以一个八进制数表示。这个数有四位数字:第一位数是针对文件的任何特殊设置(如setuid或setgid),第二位数是用户权限--用户能做什么,第三位数是组权限--文件组中的用户能做什么,第四位数是通用(world)权限--所有用户能做什么。
4、可以通过umask()取得或设置umask值。
5、函数fileatime()、filemtime()和filectime()返回一个文件的最后访问时间、更新时间和元数据修改时间。
6、文件的修改时间可以通过touch()来修改。
7、dirname()函数在与特殊的常量__FILE__组合使用时特别有用,这一常量包含着当前文件的完整路径名,这个路径名与当前执行的PHP脚本不同。
8、glob()函数会返回一个匹配完整路径名的数组。如果没有与模式匹配的文件,glob()返回false。
9、如果想同时创建目录及其父目录,可以将true作为第三个参数传递给mkdir()。这样该函数就可以通过类似递归的方式创建任何缺少的目录。
二十五、命令行PHP
如果PHP的二进制程序位于/usr/local/bin,那么脚本的第一行就要写成下面这样:
#!/usr/local/bin/php
二十六、PEAR和PECL
这部分只是个简介和安装方法,感兴趣的童鞋可以阅读专门介绍PEAR或PECL的书籍。
至此,整本《PHP Cookbook》全部读完。