F.Ko-Jiの「一秒後は未来」

PHPで「URLからutm_sourceなどutm_で始まるパラメータを削除する関数」を書く

http://example.com/?utm_source=hoge みたいなURLから「utm_」で始まるパラメータを削除して返す関数をPHPで。

なお、引数で与えられる URL に HTML エンティティは含まれていないものとしておきます。また、こういった処理が必要になる場面では大抵まず canonical URL の取得を考慮する必要があると思いますが、ここでは URL からパラメータを削除するという処理に特化して書いています。

<?php

/**
 * URLから utm_source など utm_ で始まるパラメータを削除する
 */
function removeUtmQueries($url) {
    $query = parse_url($url, PHP_URL_QUERY);

    // パラメータがなければ $url を返して終了
    if (!$query) {
        return $url;
    }

    $params = array();
    parse_str($query, $params);

    foreach ($params as $key => $val) {
        if (strpos($key, 'utm_') === 0) {
            unset($params[$key]);
        }
    }

    // パラメータが空になったらURLの?以降(#の直前まで)は削除
    if (empty($params)) {
        $url = preg_replace('!\?[^#]+!', '', $url);
    } else {
        // 空でなければ改めてクエリを構築
        $url = preg_replace('!\?[^#]+!', '?' . http_build_query($params), $url);
    }

    return $url;
}

URLっぽい文字列のパースには parse_url という関数が使えます。第2引数で PHP_URL_QUERY を指定することでクエリ部分だけ取得できるらしいです。

取り出したパラメータ部分はさらに parse_str でキーと値の組み合わせに分け、キーが utm_ で始まってるものについて unset で配列から消します。(もし utm_* 以外のパラメータを削除したかったら、ここの処理を書き換えればいいです。)

最終的には preg_replace で少し強引に URL のパラメータ部分を置換。フラグメント(#)があるかもしれないので # の手前まで。

何か考慮漏れがあるかもしれないですが大体こんな感じでできるのでは。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など