特定の文字列の中で、マルチバイトの文字だけURLエンコードしたいと考えています。
何か良い方法はありますでしょうか?
※文字列全体にurlencodeをかけてしまうと
()[],等の記号までエンコードされてしまうので。
よろしくお願い致します。
以下の様な感じでどうでしょう?
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%...
↓こんな感じでしょうか?
<?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 されたくない文字をお列挙しなおして使うことをお勧めします。
ありがとうございます。
なるほど、こういう方法もあるのですね。
勉強になりました。
参考にさせていただきます!
ありがとうございます。
同じように1文字づつ回すのは考えたのですが、
ちょっとしんどそうな印象だったので。
やはり、そういった関数が用意されていたりはしないんですね。。。