リファラ関連の処理となると、jQueryで行うことの方が多いような印象があります。
必要にせまられてPHPで処理をしようとしたところ、さらっとはできませんでしたので、メモがてらまとめることにしたいと思います。
まずはリファラを取得する
PHPでリファラを取得するには、スーパーグローバル変数である「$_SERVER変数」を利用します。
色々な情報が配列に保存されていますが、今回はリファラが必要なので…
$_SERVER['HTTP_RFFERER']
となります。
必要に応じて「parse_url」などを行うことが多いですが、今回はページタイトルを取得したいだけですので、このまま変数へ代入して処理を続行します。
変数名はわかりやすく「$referer」としておきます。
$referer = $_SERVER['HTTP_REFERER'];
さて、これでリファラが取得できるのですが、リファラは存在しないことがあります。
お気に入りなどから直接アクセスされた場合がそうですね。
なので、念のためリファラが存在しない場合を想定して処理を追加します。
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null;
ということで、リファラが存在しない場合はNULL値となるようにしてみました。
以降の処理については適当にif文で分岐する等してください。
NULLではないときだけ処理できれば問題ないので、以下の記述が手っ取り早いかと思います。
if(isset($referer))
ページタイトルを取得する
リファラのURLがわかったところで、ページタイトルを取得します。
…と、言いたいところですが、まずはHTMLソースを取得しなければいけません。
「file_get_contents」を利用して、リファラページのソースをごっそり取得します。
変数名は、ここでもわかりやすく「$source」としておきましょう。
$source = file_get_contents($referer);
ここからが問題ですね。
ソースを全て取得しましたので、$sourceから正規表現を利用して、タイトルタグの「中身」を取り出します。
preg_match('#<title>(.*?)</title>#i', $source, $result)
正規表現はあまり得意ではないのですが、一応解説しておきますと…
- 最初の#→デリミタ(ここからここまでですよの意)
- <title>→そのままマッチする文字列
- ()→カッコ内の文字を取り出します
- .*?→任意の文字列
- </title>→そのままマッチする文字列
- i→大文字小文字の区別をしないフラグ
なので、日本語で表現すると「<title>と</title>の間にある任意の文字列を、大文字小文字を区別しないで取り出す」になります。
なお、デリミタは任意の記号で良いのですが、よく使われる「/」を利用した場合、閉じタグの「/」をエスケープする必要があります。
preg_matchの第二引数は対象の文字列、第三引数は検索結果が配列として代入されます。
第三引数へ代入される配列についてですが、$matches[0] にはパターン全体にマッチしたテキストが代入され、 $matches[1] には 1 番目のキャプチャ用サブパターンにマッチした 文字列が代入されます。
タイトルだけ取得したい場合は、$result[1]になるということですね。
まとめると…
preg_matchでヒットしなかった場合の処理も加味してまとめると以下のようになります。
$title = '';
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null;
if(isset($referer)){
$source = file_get_contents($referer);
if (preg_match('#<title>(.*?)</title>#i', $source, $result)){
$title = $result[1];
}else{
$title = 'ページタイトル取得失敗';
}
}
$titleについては、どこにも該当しなかった場合のために、先頭で宣言しています。
面倒でなければif文中で宣言しても問題ありません。
以上、リファラタイトルをPHPで取得する方法でした。