PHP类库解析DOM

PHP本身内置了解析DOM的类,但是用起来有些不爽,如同在前端写JS操作DOM,悲催无比。后端如果有类似jQuery语法接口的库,那操作起来DOM就会变得很容易。网络上有个库,语法类似jQuery,名字叫做PHP Simple HTML DOM Parser。 后端解析DOM,内容是字符串或者文本文件。 $html = file_get_html($filename); // 文件文件 $html = str_get_html($string); // 字符串 获取DOM节点元素。 // 获取li节点下的文本 foreach($html->find('ul li') as $li) { $li->text(); } // 获取节点的属性 $html->find('img')->getAttribute('src') 修改节点元素。 // 将img节点的data-img属性和src属性对换 foreach($html->find('.lazy_img') as $lazy_img) { $data_img = $lazy_img->getAttribute('data-img'); $src = $lazy_img->getAttribute('src'); $img = $html->find('.lazy_img', $i); $img->setAttribute('src', $data_img); $img->set » » »阅读更多

PHP检测函数所在的文件名

很简单的功能,用到PHP中的反射机制,具体使用的是ReflectionFunction类,可以获取指定函数所在PHP脚本中的具体位置。 创建引用脚本。 // Filename: functions.php <?php function now() { return time(); } ?> 调用函数。 // Filename: call_now.php <?php require 'functions.php';   Reflection::export(new ReflectionFunction('now')); // Function [ function now ] { @@ H:\www\functions.php 2 - 4 } ?> 阅读更多

PHP两值交换

看了网上流传的一些PHP面试题。其中有一道是关于变量交换的,而且不借助中间变量完成。在平常的程序开发中,一般的思维模式是借助中间量达到变量交换的目的,几乎每个人都可以完成这样的操作。面试在于考察一个人的思维方式,当然无法和平常的开发相提并论,网上流传的答案如下。 $a = "abcd"; $b = "1234"; echo "初始化时 a=$a,b=$b"; $a = $a . $b; $b = strlen( $b ); $b = substr( $a, 0, (strlen($a) - $b ) ); $a = substr( $a, strlen($b) ); echo "交换后 a=$a,b=$b"; 下面是我采用的方式,效果是相同的。使用了PHP中的list函数,和一个临时数组。 $a = 'javascript'; $b = 'java'; echo "交换前a= $a, b= $b"; list($b, $a) = array($a, $b); echo "交换后a= $a, b= $b"; 不过我认为还会有更好的方式达到同样的效果,鉴于每个人的理解层次不同,我也能想到的答案就只有第二个了。 阅读更多

获取当前运行的PHP版本信息

获取PHP运行环境信息,可以使用下面的函数。 <?php phpinfo(); ?> 打开编辑器,保存该代码,用浏览器查看,将会看到一个包含了PHP版本运行环境详细信息的页面。 如果只想获得当前PHP的版本,可以使用下面的方式 <?php PHP_VERSION; #常量的形式 phpversion(); #函数调用的形式 ?> 阅读更多

PHP关于目录和文件操作的函数

文件是通过信息节点来组织的。每个文件(以及文件系统的其他部分,如目录、设备和连接)都拥有自己的信息节点。这个信息节点包含一个指向文件数据块位置和所有与文件相关元数据的指针。目录的数据块中保存着目录中文件的名称以及每个文件的信息节点。 opendir()函数接受一个目录参数,如果成功则返回一个目录句柄,用于closedir()、readdir()、rewinddir()调用。 readdir()读取指定目录下的所有文件,一般在循环中处理,正确遍历目录的方法: while (false !== ($file = readdir($dir))) closedir()关闭一个打开的目录句柄。 下面是PHP中文件和目录操作的一些函数 判断文件是否存在 file_exists(filename) 取得文件的访问时间 fileatime(filename) 元数据修改时间 filectime(filename) 文件拥有者所在的组 filegroup(filename) 文件的信息节点数 fileinode(filename) 内容的最后修改时间 filemtime(filename) 文件所有者 fileowner(filename) 返回文件或目录的权 » » »阅读更多

PHP之simpletest单元测试

程序开发中测试是必不可少的,对于小型项目,随处可见的是echo式的测试方式,随着项目的逐渐变大,单步测试的方式越来越不可取,也许单元测试可以是好的替代方式。我所了解的PHP下的测试程序有PEAR项目中的PHPUnit,以及simpletest。这里只是介绍一下simpletest。 首先需要下载simpletest,然后放到可以访问到的目录中就可以了。simpletest对通过测试的程序显示一个绿色的元素,而无法通过测试则显示红色的。 <?php require_once 'simpletest/unit_tester.php'; require_once 'simpletest/reporter.php'; // 包含进来这两个文件 function add($var1, $var2) { return $var1 + $var2; } class BasicUnitTest extends UnitTestCase { // 从UnitTestCase类继承 function BaicUnitTest($name = '') { $this->UnitTestCase($name); // $name作为测试页的heading显示 } function testEqual() { $this->assertEqual(25,  » » »阅读更多

PHP字符串检索

strpos()函数 int strpos(string $haystack, mixed $needle [, int $offset]) 该函数的主要目的是检索并返回$needle在$haystack中首次出现的位置,如果提供了 $offset参数,则从$haystack字符串中的$offset位置开始检索。(字符串的首字符的位置为0) <?php echo strpos('hello world', 'h'); // return 0 echo strpos('hello world', ' '); // return 5 ?> 该函数容易产生错误的地方: 如果一个字符串恰好出现在另一个字符串的首处,这时会返回0, 这样的情形如果发生在if判断的时候,PHP会把0强制转换成false,这样就无法得到想要的结果。 正确的方式应该是使用if (false !== strpos(str, char)) {}来判断。 与该函数相关的有stripos(),strrpos(),stripos() stripos()函数正向查找,不区分大小写。 <?php echo stripos('hello world', 'W'); // return 6 ?> strrpos()函数反向查找出现的第一个字符或字符串。 <?php echo strrpos('h » » »阅读更多

PHP URL编码

urlencode()、urldecode()、rawurlencode()、rawurldecode()这些函数来解决网页URL编码解码问题。 string urlencode ( string $str )返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。 string urldecode ( string $str )解码给出的已编码字符串中的任何 %##。返回解码后的字符串。 string rawurlencode ( string $str )返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。 string rawurldecode ( string $str )返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都将被替换成原义字符。 urlencode 将空格则编码为加号(+)rawurlencode 将空格则编码为加号(%20) 如果要使用utf-8的Encode,有两种方法: 一、将文件存为utf-8文件,直接使用urlencode、 rawurlencode即可。二、使用mb_convert_encoding函数。 阅读更多

PHP转义函数

string preg_quote( string $str[, string $delimiter] ) 找出$str字符串中出现的属于正则表达式的特殊字符,并在改特殊字符前面加上一个反斜线。 可以提供一个可选的$delimiter字符串参数作为新增的转义字符集合。 正则表达式的特殊字符包括: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : 。 string addslashes( string $str ) 在要写入到数据库的字符串中的特殊字符上添加反斜线,这些字符有单引号(‘)、双引号(“)、反斜线(\)与NULL(NULL字符)。 当php.ini的指令magic_quote_gpc = On时,意味着当写入数据到数据库时,数据中的特殊字符会自动加上一个反斜线。可以使用get_magic_quotes_gpc()函数进行检测magic_quote_gpc是否打开。PHP官方建议将magic_quote_gpc的值设为Off,因为这个配置的打开可能带来一定的安全问题,最好以手工的方式对写入到数据库的数据进行处理。 string addcslashes( string $str, string $charlist ) 以C语言的风格转义字符串。 » » »阅读更多

Smarty安装和使用

从Smarty官网下载。解压smarty压缩文件之后里面有libs目录,这是Smarty的库文件,这也就是Smarty的核心文件了,我们把解压后的libs目录重命名为smarty,然后放到PHP安装目录下的includes文件夹中。如果没有includes文件夹,那么创建一个,并且编辑php.ini文件,在末尾添加如下的设置: include_path=".;C:\PHP\includes" 。当然我们可以把smarty核心文件放置在任何地方,前提是需要可以require到Smarty.class.php这一文件。 目前库文件已经可以成功引用,现在该配置一下与Smarty有关的其他目录了。这里可以参考Smarty解压文件后的demo文件夹,一般直接把解压后的Smarty文件夹拷贝到web根目录就可以直接运行demo里面的文件了。当然,我们在使用Smarty开发的时候最好不要这么做。 首先在web根目录创建存放我们所要开发的应用程序的文件夹,例如:myblog。这个文件夹里面存放所有有关myblog的开发文件,当然我们还需要创建Smarty需要的几个文件夹,configs、tem » » »阅读更多