/** * オートリンク用正規表現を取得する。 * * @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]; }
/** * 配列要素にヒットする正規表現を生成する。 * * @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 ? '?' : ''); } }