[PCRE] AutoLink用の正規表現: スペースや#記号が含まれていると 'x'(PCRE_EXTENDED) をつけている場合に挙動が変わる

修正

AutoLink用の正規表現について、 「正規表現の中で空白やコメント文を使用できるようにする」ためのオプション 'x'(PCRE_EXTENDED) を使用しているため、それらを適切にエスケープしないとうまく動作しないケースがある事がわかりました。

(1.4.3)

(1.4.8)

[1.4.3] ページ名が英数字で間にスペースがあると、autolink でマッチしない

autolink.dat のスペースをエスケープしたらOKそうでした。

autolink.dat

...|InterWikiテクニカル|Wen Jiabao|ヘルプ|整形ルール|日本語)
...|InterWikiテクニカル|Wen\ Jiabao|ヘルプ|整形ルール|日本語)


[1.4.8] AutoAlias 利用時に、generate_trie_regex 関数が返す正規表現が、うまく動作しない場合がある

AutoAlias 導入前は、ページ名に# が使えないこともあって、generate_trie_regex 関数が# をエスケープしていなくても問題がありませんでした。

しかし、[[#01>test/01]] のように*1 別名に# を含むAutoAlias 設定をすると、AutoAlias の正規表現にエスケープされていない# が現れ、
InlineConverter クラスで使用する際にパターン修飾子x (PCRE_EXTENDED) によって# 以降がコメント扱いされて正規表現に不整合が発生し、エラーとなります。

generate_trie_regex 関数を

		if ($index < ($i - 1)) {
			// Some more keys found
			// Recurse
			$regex .= str_replace(array(' ','#'), array('\\ ','\\#'), preg_quote($char, '/')) .
				generate_trie_regex($array, $index, $i, $pos + 1);
		} else {
			// Not found
			$regex .= str_replace(array(' ','#'), array('\\ ','\\#'),
				preg_quote(mb_substr($array[$index], $pos), '/'));
		}

として# もエスケープするようにすると、正常に表示されるようになりました。 -- 名無しさん 2009-03-20 (金) 00:21:26


その他:


*1 例なので、短めのルールを書いています
*2 いつ誰がやってもいいですが、自分は今日はここまで
*3 とっくに汎用化したと思っていたのに・・・。 http:// www.pcre.org/pcre.txt によると、 \s は Perlとの互換性を維持するため VT <vertical tab> 文字を含んでいません。[:space:] は含んでいます。
*4 こうした正規表現から「文字列の配列」を取り戻そうとした場合には、余計なバックスラッシュが邪魔になる
*5 preg_quote_extended() を外出しにしたため、トータルでは遅いはず

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-05 (金) 00:46:07
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.210 sec.

SourceForge