人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPについて質問です。

特定の文字列の中で、マルチバイトの文字だけURLエンコードしたいと考えています。
何か良い方法はありますでしょうか?
※文字列全体にurlencodeをかけてしまうと
()[],等の記号までエンコードされてしまうので。


よろしくお願い致します。

●質問者: uchisuke
●カテゴリ:インターネット ウェブ制作
✍キーワード:PHP URL エンコード バイト マルチ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ryster
●20ポイント

以下の様な感じでどうでしょう?

function multibyteUrlencode($str, $encode)

{

$buf = '';

for($i = 0;$i < mb_strlen($str, $encode);$i++) {

$s = mb_substr($str, $i, 1, $encode);

if (strlen($s) > 1) {

$buf .= urlencode($s);

} else {

$buf .= $s;

}

}

return $buf;

}

echo multibyteUrlencode("文字列[]", "SJIS");

?>

http://www.google.co.jp/search?hl=ja&q=%E3%83%9E%E3%83%AB%E3%83%...

◎質問者からの返答

ありがとうございます。

同じように1文字づつ回すのは考えたのですが、

ちょっとしんどそうな印象だったので。

やはり、そういった関数が用意されていたりはしないんですね。。。


2 ● y-kawaz
●50ポイント

↓こんな感じでしょうか?

<?php
function urlencode_mbonly($str) {
 return preg_replace_callback('/[^\x21-\x7e]+/',
 create_function(
 '$m',
 'return urlencode($m[0]);'
 ),
 $str
 );
}

#出力は-> foo(%E3%81%BB%E3%81%92)[bar]
echo urlencode_mbonly('foo(ほげ)[bar]');
?>

やってることの要点は以下の通りです。

この例の正規表現だとマルチバイト文字以外は全て変換されないので実用に際して不都合が出ると思います。[^a-zA-Z0-9\(\)\[\]] のようにurlencode されたくない文字をお列挙しなおして使うことをお勧めします。

http://jp2.php.net/preg_replace_callback

◎質問者からの返答

ありがとうございます。

なるほど、こういう方法もあるのですね。

勉強になりました。

参考にさせていただきます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ