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 のパラメータ部分を置換。フラグメント(#)があるかもしれないので # の手前まで。
何か考慮漏れがあるかもしれないですが大体こんな感じでできるのでは。
コメントを残す