Gregarius 0.6.1 的错误函数修正

Dec 3, 2009
以下内容恢复自 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)

[back]