Gregarius 0.6.1 的错误函数修正
以下内容恢复自 Wordpress 时期的数据库备份,内容已经严重过期,仅留作纪念。
最近在研究 RSS 聚合程序,个人觉得相对最好的程序是 Gregarius,效率高、负载低、口碑不错。
由于此程序的最后更新时间是 2008-11-26,那就要考虑到新版本PHP不支持函数的问题。
<img src="http://www.evlos.org/ev-box/myimg/uploads/Capture0524.jpg" />
像上图一样,此函数在 PHP 5.3.0 中会被屏蔽,在 PHP 6.0.0 里会被删除掉,同时可被替代。
因为 PHP 团队将删除支持 Portable Operating System Interface (POSIX) 正则表达式的扩展。
1. Eregi 函数的语法:
int eregi(string pattern,string string [,array regs]);
2. Eregi 函数的解释:
搜寻 string 来和 pattern 的正规表示比对。
若找到比对则会呼叫第三个参数 regs,比对的结果会储存在 regs 的元素之中。
$regs[1] 为符合第一个左边括弧 (parenthesis) 的部份字符串,$regs[2] 为符合第二个括弧的部份字符串。
以此类推,$regs[0] 为参数 string。
如果 ereg() 找到比对,则 $regs 会被十个元素来填满,即使是多于或少于十个括弧内的部份字符串。
也可以比对,这将不影响 ereg() 去比对更多部份字符串的能力。如果比对不到,$regs 将不会被 ereg() 改变。
搜寻是不区分大小写的。
如果在 string 中比对到 pattern 则传回 true,如果比对不到或是发生错误则传回 false。
3. Eregi 函数的官方范例:
<?php
$date=\"2009-02-12\";
if (ereg (\"([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})\", $date, $regs)) {
echo \"$regs[3].$regs[2].$regs[1]\";
}
else {
echo \"Invalid date format: $date\";
}
?>
以上的范例会将日期格式 YYYY-MM-DD 切断,并且把它显示成 DD.MM.YYYY 的格式。
4. 如何使用新的函数:
新的函数是 preg_match(),语法如下。
int preg_match ( string $pattern , string $subject [,
array &$matches [, int $flags [, int $offset ]]] )
5. 如何修复 Gregarius 0.6.1:
function getPath($path=\'\') {
static $ret;
if ($ret === NULL) {
$ret = dirname($_SERVER[\'PHP_SELF\']);
if (defined(\'RSS_FILE_LOCATION\') && eregi(RSS_FILE_LOCATION.\"\\$\", $ret)) {
$ret = substr($ret, 0, strlen($ret) - strlen(RSS_FILE_LOCATION));
}
if (substr($ret, -1) == \"\\\\\") { // Take off trailing backslash
$ret = substr($ret, 0, -1);
}
if (substr($ret, -1) != \"/\") { // Add a frontslash
$ret .= \"/\";
}
}
return $ret . $path;
}
$dummy = getPath();
eregi(RSS_FILE_LOCATION.\"\\$\", $ret)
以上的函数修复如下,即把 POSIX 表达式修改成 PCRE 表达式:
preg_match(RSS_FILE_LOCATION.\"\\$/i\", $ret)