PHPについて質問です。


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


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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/11/18 10:30:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:ryster No.1

回答回数2ベストアンサー獲得回数0

ポイント20pt

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

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%...

id:uchisuke

ありがとうございます。

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

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

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

2007/11/18 10:26:01
id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント50pt

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

<?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]');
?>

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

  • preg_replace_callbackで特定文字(マルチバイト文字)だけにurlencodeを実行する。
  • [^\x21-\x7e]+ はASCII(半角文字)以外、つまりマルチバイト文字にマッチします。
  • callback関数の引数は配列で来るのでその第1要素だけをurlencodeに渡す無名関数をcreate_functionで作ってます。

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

http://jp2.php.net/preg_replace_callback

id:uchisuke

ありがとうございます。

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

勉強になりました。

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

2007/11/18 10:29:48

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません