[PCRE] 特定の文字列がBracketNameでリンクにならない†
- ページ: BugTrack
- 投稿者: henoheno
- 優先順位: 重要
- 状態: 保留
- カテゴリー: その他
- 投稿日: 2004-12-12 (日) 10:43:03
- バージョン:
メッセージ†
official:続・質問箱/480より。特定のサイトで、特定の文字の組み合わせがページ名として認識されない。(ブラケットで囲んでもリンクにならない / 新規ページ作成をしようとしてもWikiNameではないと言われる)
今のところPHPのバージョンか、PHPのモジュールに依存すると思われている。PukiWikiでケアできるかは不明。
NG:†
- devサイト(ここ): Debian woody + Apache 1.3.26 + PHP 4.1.2
- CliffordSakakiさんのMac: MacOSX 10.3.6 + Apache 1.3.33 + PHP 4.3.2 + PukiWiki 1.4.4 -- PHPはパッケージ版?
- でぃあばぁ: Windows2000 + AN HTTPD + PHP 4.3.2 + PukiWiki 1.4.4
OK:†
- orgサイト: Nature's Linux + Apache 1.3.x + PHP 4.3.9
- にぶんのに: Linux + Apache + PHP 4.3.4
- henoheno: FreeBSD 4.10 + Apache 2.0.52_2 + PHP 4.3.9 + PukiWiki (1.4 and 1.4.4)
- CliffordSakakiさんのMac: MacOSX 10.3.6 + Apache 1.3.33 + PHP 4.3.9 + PukiWiki 1.4.4 -- PHPを 4.3.9 (パッケージ版)にすることで直ったという
- teanan: Windwos2000 + Microsoft-IIS/5.0 + PHP 4.3.8 + PukiWiki 1.4.4
- teanan: MacOSX(Darwin Kernel Version 7.6.0) + Apache 1.3.29 + PHP 4.3.4 + PukiWiki 1.4.4
- でぃあばぁ: Windows2000 + AN HTTPD + PHP 4.3.3 + PukiWiki 1.4.4
以上から言えそうな点†
- Unix like OSの種類には関係がなさそうである
- Apacheのバージョンや系統には関係がなさそうである (1.3.xでも2.xでもOKの事例がある)
- PHP のバージョンあるいは内部モジュール、関連ライブラリと関係がありそうである
- 特に PHP 4.3.3 あたりが境界ではないかという指摘あり
- PukiWiki のバージョンには関係が無さそうである (1.4でも1.4.4でもOKの事例がある)
報告例†
問題ない例†
test†
test2†
test3†
bracket | euc |
a タ | a%20%A5%BF |
a ダ | a%20%A5%C0 |
a Э | a%20%A7%BF |
a Ю | a%20%A7%C0 |
a ┸ | a%20%A8%BF |
a ╂ | a%20%A8%C0 |
a 或 | a%20%B0%BF |
a 粟 | a%20%B0%C0 |
a 運 | a%20%B1%BF |
a 雲 | a%20%B1%C0 |
test4†
コメント†
- 難しいことは良く分からないのですが、気になったので以下のようにテストしてみました。環境はWindows2000 + AN HTTPD + PHP にしてみました。 -- でぃあばぁ
- テストプログラム (EUC-JP)
<?php
$a = array('o タ', 'o ダ');
foreach ($a as $s) {
echo preg_replace('/.+(?<!\s)$/', 'X' , $s).'<br>';
}
?>
- PHP4.3.2での出力
o タ
X
- PHP4.3.3での出力
X
X
- 可能であれば、phpが使用しているPCRE(Perl Compatible Regular Expressions)のバージョンを調査してみてください。
<?php phpinfo(); ?>
- PHP Version 4.1.2
- PCRE Library Version 3.4 22-Aug-2000
- PHP Version 4.3.2
- PCRE Library Version 3.92 11-Sep-2002
- PHP Version 4.3.3
- PCRE Library Version 4.3 21-May-2003
- PHP Version 4.3.4
- PCRE Library Version 4.3 21-May-2003
- PHP Version 4.3.8
- PCRE Library Version 4.5 01-December-2003
- PHP Version 5.0.2
- PCRE Library Version 4.5 01-December-2003
- 上でOKとなっているPHP4.3.4環境は PCRE Library Version 4.3 21-May-2003 を使っていました -- にぶんのに
- Win環境では問題なさそうです。 -- teanan
- うちのサイトのMacも追加しました。PHP4.3.4で同じくPCRE 4.3のようです。特に問題ないです。 -- teanan
- PCREのテストツール、pcretestでテストしてみました。環境はRedHatLinux9(LANG="ja_JP.eucJP"、データファイルもEUC-JP)。4.3のChangeLogの6,7辺りが怪しいかなあと思います。 -- でぃあばぁ
- ./configure としてコンパイルしたもの
- ./configure --enable-utf8 としてコンパイルしたもの
- お疲れ様です。結局PCREの問題っぽいということでしょうか :) -- henoheno
- \040は\sと等価な様なので、PCRE4.3のChangeLogの7に該当するように思えます。 -- でぃあばぁ
A lookbehind in a pattern matched in non-UTF-8 mode on a PCRE compiled with
UTF-8 support could misbehave in various ways if the subject string
contained bytes with the 0x80 bit set and the 0x40 bit unset in a lookbehind
area. (PCRE was not checking for the UTF-8 mode flag, and trying to move
back over UTF-8 characters.)
- lookbehindの問題らしいので、短絡的ですが暫定的には以下のようにすることでリンクされるようになりますね。ただ、スペースを末尾に含むページを作れてしまう、[[foo #bar]]のように書いてもリンクされてしまうなど問題も多いです。セキュリティの問題もありますし、可能であれば最新のPHPに上げた方が良さそうです (^^; -- でぃあばぁ
$BracketName = '(?!\s):?[^\r\n\t\f\[\]<>#&":]+:?';