[PHP] URLの日本語だけエンコードする

URL全体を受け取りマルチバイト文字だけURLエンコードして返す関数(マルチバイト文字はUTF-8前提)。エンコードされてるかどうか不明なユーザー入力URLをエンコードしたい時などに。

function mb_urlencode( $url )
{
    $callback = function( $matches )
    {
        return rawurlencode($matches[0]);
    };
    return preg_replace_callback('/[^\x21-\x7e]+/', $callback, $url);
}