用php5的simplexml解析各种feed

最近使用simplexml来解析各种feed源,碰到了一些小问题。

用simplexml处理atom数据

很多博客使用atom来输出数据,但是atom使用了名称空间(namespace),所以现在请求被命名的元素和本地名称时必须指定名称空间统一资源标识符(URI),还有一点就是simplexml的xpath方法无法直接query这个xml tree。

从 PHP 5.1 版开始,SimpleXML 可以直接对带名称空间的文档使用 XPath 查询。和通常一样,XPath 位置路径必须使用名称空间前缀,即使搜索的文档使用默认名称空间也仍然如此。registerXPathNamespace() 函数把前缀和后续查询中使用的名称空间 URL 联系在一起。

下面是使用xpath查询atom文档title元素的例子:


$atom =  simplexml_load_file('http://www.ooso.net/index.php/feed/atom');
$atom->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
$titles = $atom->xpath('//atom:title');
foreach ($titles as $title) 
  echo "

" . $title . "

";

用simplexml处理rss数据

wordpress可以输出rss2的数据源,这里面也有一些不同的namespace,比如dc。一个使用simplexml解析rss2的例子:

Continue reading “用php5的simplexml解析各种feed”

php5中的date函数

php5.1.1以后,date函数新增了以下常量。

自 PHP 5.1.1 起定义有以下常量来提供标准日期表达方法,可以用于日期格式函数(例如 date())。

DATE_ATOM(string)
原子钟格式(如:2005-08-15T15:52:01+00:00)

DATE_COOKIE(string)
HTTP Cookies 格式(如:Mon, 15 Aug 2005 15:52:01 UTC)

DATE_ISO8601(string)
ISO-8601(如:2005-08-15T15:52:01+0000)

DATE_RFC822(string)
RFC 822(如:Mon, 15 Aug 2005 15:52:01 UTC)

DATE_RFC850(string)
RFC 850(如:Monday, 15-Aug-05 15:52:01 UTC)

DATE_RFC1036(string)
RFC 1036(如:Monday, 15-Aug-05 15:52:01 UTC)

DATE_RFC1123(string)
RFC 1123(如:Mon, 15 Aug 2005 15:52:01 UTC)

DATE_RFC2822(string)
RFC 2822(如:Mon, 15 Aug 2005 15:52:01 +0000)

DATE_RSS(string)
RSS(如:Mon, 15 Aug 2005 15:52:01 UTC)

DATE_W3C(string)
World Wide Web Consortium(如:2005-08-15T15:52:01+00:00)

比如,要输出一个RSS需要的日期格式,就可以用下面的代码简单实现:

echo date(DATE_RSS);

[php5]将xml转换成json最简单的办法

在php5下,将xml转换成json最简单的办法,就是利用simplexml和json扩展。

废话不多说,贴代码:

<?php
$xml = <<

    
        Code Generation in Action
        JackHerrington
        Manning
    


    
        PHP Hacks
        JackHerrington
        O'Reilly
    


    
        Podcasting Hacks
        JackHerrington
        O'Reilly
    

EOF;

echo $json = json_encode(simplexml_load_string($xml));
?>

整个过程就是一行,灰墙之ez.

另:可以跟以前写的“用php将rss转化为json格式”比较一下.

PHP4的历史任务完成

PHP.net宣布,他们将在今年年底停止php4的开发,安全方面的更新也会于2008年8月结束。

PHP4发布于2000年五月,这一年我刚刚学会拨号上网,申请email帐号收发邮件。在2004年,php家族的老五出世, 而这个时候,支持php4的主机以及开源软件已经四处开花。3年后,php4仍然在各大主机上占据绝对份额的优势,尤其是在国内。因为大量的开源代码仍然是php 4 only的,你不知道客户会在hosting上跑什么样的程序。还有一大批的php程序员在维护前人留下的php 4代码,或者在这个基础上接着开发,比如俺… 这对主机商或开发人员来说都不是一件好事情,客户不在乎你用的是php 4还是php 5,这无关紧要,只要代码能跑,功能实现就皆大欢喜了。

前不久的GoPHP5活动,是php开源世界开发人员对现状的一种回应,也是在php核心开发人员推动下的结果。只有得到目前广泛的php开发人员的支持,PHP.net才有底气说2007年底停止php4的开发。

php4能够在如此之久的时间里长盛不衰,证明php 4是成功的。它的历史任务,完成了!

php5的一些参考资料

Go PHP5!

PHP5是在3年前发布的,在这期间,PHP4仍然在为我们提供服务,大量主机hosting上还是永远的php4,关于使用率可以参考php在2007五月的使用统计。之所以造成这种情况,有着多方面的原因。

首先PHP开发者还没摸透在没有php4的情况下,用php5来跑从前的应用会不会有潜在的问题。大量主机上仍然安装的是php4,这会使用户避免选择php5 only的web应用程序。也是因为这个原因,大量主机商还不能马上升级到php5,因为他们不知道用户将要跑php4或是php5的web应用。这样一来,php的开发者越发不能摆脱php4,他们为了适应环境,写出来的代码可能都是php4/php5兼容的。

这对php开发者来说,是如同梦魇一般的一个死循环。一些open source的php开发团体为了摆脱这个困境,终于决定做出一些动作来打破僵局了!!他们在2008年2月份以后发布程序将仅仅官方的支持php 5.2.0以后的版本(官方的支持意味着某些程序还是能保持php4的兼容性的,但是不承诺)!!这个活动被称之为GoPHP5!!这些php开发团体已知的名单如下:

Drupal
Joomla
CakePHP
Symfony(这个已经是php5 only了)
Gallery
WordPress

对于用户来说,使用php4或者php5无关紧要,他需要的仅仅是他的程序可以run。那么列表中拥有大量用户基础的php程序的转向,将会是驱动主机商升级到php5的极大动力。

Continue reading “Go PHP5!”

用simplexml解析rss出错

尝试用simplexml解析一个rss数据源,碰到了一个不小的麻烦。每次解析会碰到一个报错:

Warning: SimpleXMLElement::__construct() [function.SimpleXMLElement—construct]: Entity: line 161: parser error : Entity ‘Acirc’ not defined in D:\xampp\htdocs\rss.php on line 11

这是解析rss的php代码片段:

try {
	$xml = new SimpleXMLElement($rss);
	var_dump($xml);
} catch(Exception $e) {
	echo $e->getMessage();
}

查看rss数据源,发现里面有一些乱字符,尝试过滤掉乱字符。

用下面的xmlSafe函数过滤字符,问题解决。

function xmlSafe(&$xml_str) {
	$xml_str =preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/",'',$xml_str);
}

ubuntu下安装php5 + pdo

这几天尝试把工作机迁到ubuntu上来做开发,系统安装好之后的首要任务是安装php+mysql的开发环境. 我打算直接安装php5, pdo_mysql, 下面是安装过程的记录

首先我直接用apt-get安装了apache2,php5,pear以及mysql5, 为了方便后续的安装,还加上了make和libmysqlclient

  • sudo apt-get install apache2-mpm-prefork
  • sudo apt-get install php5
  • sudo apt-get install php5-dev
  • sudo apt-get install php5-pear
  • sudo apt-get install mysql-server-5.0
  • sudo apt-get install make
  • sudo apt-get install libmysqlclient15-dev

pdo在ubuntu的apt里头似乎还找不到安装源,所以通过pecl来安装这个扩展,非常简单 —- 如果海底光纤能连通的话:

pecl install pdo

增加一行:

extension=pdo.so

到文件:

/etc/php/apache2/php.ini
/etc/php/cli/php.ini

接下来安装pdo_mysql碰到一些问题, 直接跑pecl install pecl_mysql会出现一些错误,搜索了一下发现是pecl本身的问题,下面是个比较简单的解决办法:

wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
tar xzvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2

注释掉configure里头判断是否已经安装pdo扩展的代码片段,继续跑:

phpize
./configure
make
make install

然后再次添加下面一行到前面提到的两个php.ini

extension=pdo_mysql.so

重启apache之后, php5 + pdo_mysql就在ubuntu上安装好了, documentroot是/var/www

后记

更简单的解决办法是运行:

PHP_PDO_SHARED=1 pecl install pdo_mysql

Pear的PHP_Compat包

Pear的PHP_Compat是个比较有趣的包,它提供了一些php4下也能使用的php5专有函数,比如file_put_contents,array_combine,str_split……….这样即使是在php4的主机上,也能提前享受一点php5函数的便利.

用法

<?php
require_once 'PHP/Compat.php';

// load file_put_contents
PHP_Compat::loadFunction('file_put_contents');

// load str_split, array_chunk and file_get_contents
PHP_Compat::loadFunction(array('str_split', 'array_chunk', 'file_get_contents'));
?>

上面的例子说明,可以一次载入n个php5特有函数

Package Information: PHP_Compat

http://pear.php.net/package/PHP_Compat

Embeder – 把php脚本编译成可执行文件

Embeder是一个命令行工具,可以将php脚本编译成windows下的可执行文件。从介绍上来看,它目前支持php5,所以也可以用来编译php-gtk2的程序文件。

使用前提

  • 把下面列出来的脚本全部复制一遍,并放在同一个目录
  • php5ts.dll必须在path下,或者在当前目录
  • php_win32std.dll必须安装在php的extension目录下(见php-embed.ini的配置)
  • embeder.exe也需要和上述文件在同一目录

测试文件

  • make.bat
    @echo off
    embeder.exe new myapp
    embeder.exe main myapp main.php
    embeder.exe add myapp include.inc
  • include.inc
  • main.php
  • 其实解压后就可以运行test目录下的make.bat做一个编译试验,上面所列文件已经存在。

  • 参考文档
  • http://wildphp.free.fr/wiki/doku.php?id=win32std:embeder

    PHP5的Simplexml

    php5新增了Simplexml extension,我们可以借助它来解析,修改XML。在IBM的知识库里找到一篇文章对此做了专门的介绍,而且比较详细,感兴趣的话可以看看最后的参考文档。

    一个RSS Feed

    下面是一个RSS的例子,我们准备用simplexml来解析它。
    [xml]< ?xml version="1.0" encoding="UTF-8"?>


    Mokka mit Schlag http://www.elharo.com/blog
    en

    Penn Station: Gone but not Forgotten

    The old Penn Station in New York was torn down before I was born.
    Looking at these pictures, that feels like a mistake. The current site is
    functional, but no more; really just some office towers and underground
    corridors of no particular interest or beauty. The new Madison Square…
    http://www.elharo.com/blog/new-york/2006/07/31/penn-station


    Personal for Elliotte Harold
    Some people use very obnoxious spam filters that require you
    to type some random string in your subject such as E37T to get through.
    Needless to say neither I nor most other people bother to communicate with
    these paranoids. They are grossly overreacting to the spam problem.
    Personally I won’t …

    http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/


    [/xml]

    解析XML

    首先载入一个xml

    $rss =  simplexml_load_file('http://www.ooso.net/index.php/feed/');

    Continue reading “PHP5的Simplexml”