プロが教える店舗&オフィスのセキュリティ対策術

現在、Wikiのようなものを作ろうとしていて、
文章中に [[文字列]] があった場合、 <a href="文字列">文字列</a> のような形に置き換えたいのですが、
次のようにすると、$strが「マ」などを含んでいる場合にエラーが起こってしまいます。

$str=preg_replace("/\[\[(.+)\]\]/e","'<a href=\"'.urlencode($1).'\">$1</a>'",$str);

「表」なども、もちろんエラーになります。
どのようにすれば良いのでしょうか。
あるいは、そもそも、別の方法で置き換えた方が良いのでしょうか。


また、過去ログ(http://oshiete1.goo.ne.jp/kotaeru.php3?q=1844374)に、
「表」といった\を含む文字列のURLエンコードをする際は、
「EUC」に文字エンコーディングを変換してから行うようにとの回答がありましたが、
以下のようにしてもエラーが起こってしまいます。

$str="表";
$str=urlencode(mb_convert_encoding($str, "EUC-JP", "SJIS"));

どのように書けば良いのでしょうか。


合わせて困っております。
ご教授を宜しくお願い致します。

なお、
mbstring.encoding_translation=Off
になってます。レンタルサーバーのため、変更できません。

A 回答 (2件)

#1です



> それも検討してみることにします。
一応私は「秀丸」というを使ってます。

> これらは全て同様に設定して、防ぐしかないのでしょうか。

$str = preg_replace( "/\[\[([^\].]+)\]\]/e" , "'<a href=\"' . urlencode(\"$1\") . '\">$1</a>'" , $str );
こんな感じでいけるみたいです。

これは文字コードがというよりは、構文的な問題になるのかなぁ・・

P.S.
 エラーになるという場合でも、どんなエラーがどの行で出るのか等
 分かる範囲で書いておくといいですよん

この回答への補足

御免なさい。

>> PATH_INFOで引数を受けているので必要ないでしょうかね?

と書きましたが、PATH_INFOでも上の階層へリンク出来てしまうのですね。
大変失礼致しました。

補足日時:2006/09/21 14:02
    • good
    • 0
この回答へのお礼

全く問題なく動くようになりました。
迅速なご回答を有り難う御座います。
構文的な問題でしたか・・・。
何故、\"$1\"とすれば上手くいくのかすら分かりません;

ところで、正規表現でドット(.)を外す理由は、上の階層にアクセスされることを防ぐためでしょうか?
PATH_INFOで引数を受けているので必要ないでしょうかね?

> 一応私は「秀丸」というを使ってます。

有り難う御座います。参考にさせて頂きます。

> どんなエラーがどの行で出るのか等...

そうですね。失礼致しました。
次回から気をつけます。

お礼日時:2006/09/21 13:49

 $str = mb_convert_encoding( $str, "euc-jp", "sjis" );


 $str = preg_replace( "/\[\[([^\].]+)\]\]/e" , "'<a href=\"' . urlencode($1) . '\">$1</a>'" , $str );
 $str = mb_convert_encoding( $str, "sjis", "euc-jp" );

こんな感じかな・・
replaceはEUCで行いつつ、SJISに戻して表示する

※正規表現部分ちょっと変更してみた

でも、そもそも全体をEUCで書いちゃえば↑のような面倒臭いことしなくていいんじゃないかなぁ
    • good
    • 0
この回答へのお礼

回答、どうも有り難う御座います。
ご教授頂いたもので上手くいきました。感謝致します。

> 全体をEUC

これまでWindows標準のメモ帳(EUCでの保存不可)しか使っていなくて、
他のソフトを使うのは避けたかったのですが、何かとEUCで保存した方が便利そうですね。
それも検討してみることにします。

> ※正規表現部分ちょっと変更してみた

他にも「 ( ) : # 」といった記号が含まれているとエラーになるようなのですが、
これらは全て同様に設定して、防ぐしかないのでしょうか。
文字コードについては、恥ずかしいほど無知故に全く分からないのですが、
どういった物を例外処理する必要があるのでしょうか。


p.s.

>> $str="表";
>> $str=urlencode(mb_convert_encoding($str, "EUC-JP", "SJIS"));

というのは、そもそも "表" とした時点でエラーになるのですね。
失礼致しました。

お礼日時:2006/09/21 12:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!