* [PCRE] 特定の文字列がBracketNameでリンクにならない [#v39c0c99]

-ページ: BugTrack
-投稿者: [[henoheno]]
-優先順位: 重要
-状態: 提案
-状態: 保留
-カテゴリー: その他
-投稿日: 2004-12-12 (日) 10:43:03
-バージョン: 

--------------------
#contents
--------------------
**メッセージ [#n2a2d1df]

[[official:続・質問箱/480]]より。特定のサイトで、特定の文字の組み合わせがページ名として認識されない。(ブラケットで囲んでもリンクにならない / 新規ページ作成をしようとしてもWikiNameではないと言われる)

今のところPHPのバージョンか、PHPのモジュールに依存すると思われている。PukiWikiでケアできるかは不明。

*** NG: [#vfd7be88]
- 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: [#ne749987]
- 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

*** 以上から言えそうな点 [#ve493f94]
- Unix like OSの種類には関係がなさそうである
- Apacheのバージョンや系統には関係がなさそうである (1.3.xでも2.xでもOKの事例がある)
- PHP のバージョンあるいは内部モジュール、関連ライブラリと関係がありそうである
-- 特に PHP 4.3.3 あたりが境界ではないかという指摘あり
- PukiWiki のバージョンには関係が無さそうである (1.4でも1.4.4でもOKの事例がある)

-------------------------------------
** 報告例 [#v33fc2b3]
- [[アート オブ ウォー]] → [[ト オ]] [[ブ ウ]]
- [[アンリミテッド サガ]] → [[ド サ]]
- [[イースIII ワンダラーズ フロム イース]] → [[I ワ]] [[ズ フ]] [[ム イ]]
- [[エース コンバット 04 シャッタード スカイ]] → [[ス コ]] [[ト 0]] [[4 シ]] [[ド ス]]
- [[エンパイア アース]] → [[ア ア]]

*** 問題ない例 [#v6bac209]
-[[アーマードコアIII サイレントライン]]
-[[アール・タイプ ファイナル]]
-[[R レーシング エヴォリューション]]
-[[アクア ゾーン]]
-[[アドバンスド ファンタジアン]]

*** test [#v272d406]
-[[ア ア]]
-[[ア カ]]
-[[ア サ]]

-[[ア タ]]
-[[ア ダ]]
-[[ア チ]]
-[[ア ヂ]]
-[[ア ツ]]
-[[ア ヅ]]
-[[ア テ]]
-[[ア デ]]
-[[ア ト]]
-[[ア ド]]

-[[ア ナ]]
-[[ア ハ]]
-[[ア マ]]
-[[ア ヤ]]
-[[ア ラ]]
-[[ア ワ]]

***test2 [#vab63402]
|[[a 亜]]|a%20%B0%A1|
|[[a 葦]]|a%20%B0%B1|
|[[a 芦]]|a%20%B0%B2|
|[[a 鯵]]|a%20%B0%B3|
|[[a 梓]]|a%20%B0%B4|
|[[a 圧]]|a%20%B0%B5|
|[[a 斡]]|a%20%B0%B6|
|[[a 扱]]|a%20%B0%B7|
|[[a 宛]]|a%20%B0%B8|
|[[a 姐]]|a%20%B0%B9|
|[[a 虻]]|a%20%B0%BA|
|[[a 飴]]|a%20%B0%BB|
|[[a 絢]]|a%20%B0%BC|
|[[a 綾]]|a%20%B0%BD|
|[[a 鮎]]|a%20%B0%BE|
|[[a 或]]|a%20%B0%BF|
|[[a 粟]]|a%20%B0%C0|
|[[a 袷]]|a%20%B0%C1|
|[[a 安]]|a%20%B0%C2|
|[[a 庵]]|a%20%B0%C3|
|[[a 按]]|a%20%B0%C4|
|[[a 暗]]|a%20%B0%C5|

***test3 [#v863a64c]
|bracket|euc|h
|[[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 [#ve0a7995]
|[[a ァ]]|
|[[a ア]]|
|[[a ィ]]|
|[[a イ]]|
|[[a ゥ]]|
|[[a ウ]]|
|[[a ェ]]|
|[[a エ]]|
|[[a ォ]]|
|[[a オ]]|
|[[a カ]]|
|[[a ガ]]|
|[[a キ]]|
|[[a ギ]]|
|[[a ク]]|
|[[a グ]]|
|[[a ケ]]|
|[[a ゲ]]|
|[[a コ]]|
|[[a ゴ]]|
|[[a サ]]|
|[[a ザ]]|
|[[a シ]]|
|[[a ジ]]|
|[[a ス]]|
|[[a ズ]]|
|[[a セ]]|
|[[a ゼ]]|
|[[a ソ]]|
|[[a ゾ]]|
|[[a タ]]|
|[[a ダ]]|
|[[a チ]]|
|[[a ヂ]]|
|[[a ッ]]|
|[[a ツ]]|
|[[a ヅ]]|
|[[a テ]]|
|[[a デ]]|
|[[a ト]]|
|[[a ド]]|
|[[a ナ]]|
|[[a ニ]]|
|[[a ヌ]]|
|[[a ネ]]|
|[[a ノ]]|
|[[a ハ]]|
|[[a バ]]|
|[[a パ]]|
|[[a ヒ]]|
|[[a ビ]]|
|[[a ピ]]|
|[[a フ]]|
|[[a ブ]]|
|[[a プ]]|
|[[a ヘ]]|
|[[a ベ]]|
|[[a ペ]]|
|[[a ホ]]|
|[[a ボ]]|
|[[a ポ]]|
|[[a マ]]|
|[[a ミ]]|
|[[a ム]]|
|[[a メ]]|
|[[a モ]]|
|[[a ャ]]|
|[[a ヤ]]|
|[[a ュ]]|
|[[a ユ]]|
|[[a ョ]]|
|[[a ヨ]]|
|[[a ラ]]|
|[[a リ]]|
|[[a ル]]|
|[[a レ]]|
|[[a ロ]]|
|[[a ヮ]]|
|[[a ワ]]|
|[[a ヰ]]|
|[[a ヱ]]|
|[[a ヲ]]|
|[[a ン]]|
|[[a ヴ]]|
|[[a ヵ]]|
|[[a ヶ]]|

----
** コメント [#vc0f1e9c]

-難しいことは良く分からないのですが、気になったので以下のようにテストしてみました。環境はWindows2000 + AN HTTPD + PHP にしてみました。 -- [[でぃあばぁ]] &new{2004-12-12 (日) 13:46:16};
--テストプログラム (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 を使っていました -- [[にぶんのに]] &new{2004-12-12 (日) 16:40:21};
-Win環境では問題なさそうです。 -- [[teanan]] &new{2004-12-12 (日) 18:35:55};
-うちのサイトのMacも追加しました。PHP4.3.4で同じくPCRE 4.3のようです。特に問題ないです。 -- [[teanan]] &new{2004-12-12 (日) 18:49:10};
-PCREのテストツール、pcretestでテストしてみました。環境はRedHatLinux9(LANG="ja_JP.eucJP"、データファイルもEUC-JP)。[[4.3のChangeLog>http://sourceforge.net/project/shownotes.php?release_id=162042]]の6,7辺りが怪しいかなあと思います。 -- [[でぃあばぁ]] &new{2004-12-13 (月) 16:46:11};
-- ./configure としてコンパイルしたもの
---PCRE version 4.2 14-Apr-2003
 /.+(?<!\s)$/
 o タ
  0: o \xa5\xbf
 o ダ
  0: o \xa5\xc0
---PCRE version 4.3 21-May-2003
 /.+(?<!\s)$/
 o タ
  0: o \xa5\xbf
 o ダ
  0: o \xa5\xc0
-- ./configure --enable-utf8 としてコンパイルしたもの
---PCRE version 4.2 14-Apr-2003
 /.+(?<!\s)$/
 o タ
 No match
 o ダ
  0: o \xa5\xc0
 data>
---PCRE version 4.3 21-May-2003
 /.+(?<!\s)$/
 o タ
  0: o \xa5\xbf
 o ダ
  0: o \xa5\xc0
-お疲れ様です。結局PCREの問題っぽいということでしょうか :) -- [[henoheno]] &new{2004-12-13 (月) 22:34:35};
-\040は\sと等価な様なので、[[PCRE4.3のChangeLog>http://sourceforge.net/project/shownotes.php?release_id=162042]]の7に該当するように思えます。 -- [[でぃあばぁ]] &new{2004-12-13 (月) 23:58:38};
 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に上げた方が良さそうです (^^; -- [[でぃあばぁ]] &new{2004-12-23 (木) 11:04:47};
 $BracketName = '(?!\s):?[^\r\n\t\f\[\]<>#&":]+:?';

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.074 sec.

OSDN