/** * ソース中のリンクを取得 * @param $source Wikiソース * @return array */ private static function getLinkList($source) { static $plugin_pattern, $replacement; // プラグインを無効化するためのマッチパターンを作成 if (empty($plugin_pattern) || empty($replacement)) { foreach (PluginRenderer::getPluginList() as $plugin => $plugin_value) { if ($plugin === 'ref' || $plugin === 'attach' || $plugin === 'attachref') { continue; } // ただしrefやattachは除外(あまりブロック型で使う人いないけどね) $plugin_pattern[] = '/^#' . $plugin . '\\(/i'; $replacement[] = '#null('; } } $ret = array(); // 1行づつ置き換え foreach ($source as $line) { $ret[] = preg_replace($plugin_pattern, $replacement, $line); } $links = array(); // プラグインを無効化したソースをレンダリング $html = RendererFactory::factory($ret); // レンダリングしたソースからリンクを取得 preg_match_all(self::HTML_URI_MATCH_PATTERN, $html, $links, PREG_PATTERN_ORDER); unset($html); return array_unique($links[1]); }