Example #1
0
 /**
  * オートリンク用正規表現を取得する。
  * 
  * @param    string    $dir    起点となるディレクトリ名。
  * @return    string    正規表現。
  */
 function getexpression($dir = '')
 {
     if (!isset($this->expression[$dir])) {
         $db = DataBase::getInstance();
         $_dir = $db->escape($dir);
         $result = $db->query("SELECT exp FROM autolink WHERE dir = '{$_dir}'");
         $row = $db->fetch($result);
         if ($row == false) {
             $list = $this->listup($dir);
             $exp = makelinkexp($list);
             $_exp = $db->escape($exp);
             $db->query("INSERT INTO autolink (dir, exp) VALUES('{$_dir}', '{$_exp}')");
             $this->expression[$dir] = $exp;
         } else {
             $this->expression[$dir] = $row['exp'];
         }
     }
     return $this->expression[$dir];
 }
Example #2
0
/**
 * 配列要素にヒットする正規表現を生成する。
 * 
 * @param	array(string)	&$pagelist	この関数の実行後、$pagelistの中身は保証されない。
 * @return	string	正規表現
 */
function makelinkexp(&$pagelist)
{
    if (count($pagelist) <= 1) {
        return count($pagelist) == 0 ? '' : mb_ereg_quote($pagelist[0]);
    }
    $emptyflag = false;
    $bin = array();
    while ($pagelist != array()) {
        $pagename = array_pop($pagelist);
        if ($pagename != '') {
            $bin[mb_substr($pagename, 0, 1)][] = mb_substr($pagename, 1);
        } else {
            $emptyflag = true;
        }
    }
    $key = array_keys($bin);
    foreach ($key as $k) {
        $ret[] = mb_ereg_quote($k) . makelinkexp($bin[$k]);
    }
    if (count($ret) == 1) {
        return $emptyflag ? '(?:' . $ret[0] . ')?' : $ret[0];
    } else {
        return '(?:' . join('|', $ret) . ')' . ($emptyflag ? '?' : '');
    }
}