JavaScriptを有効にしてください

【PHP】URLを解析する parse_url

 ·  ☕ 2 分で読めます

【PHP】URLを解析する parse_url

URLを解析することができる parse_url

URL を解析してみる

実際にPHPManualに記載されている例にならって解析をさせてみます。
PHP: parse_url - Manual 例1

1
2
3
4
<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';

var_dump(parse_url($url));

結果

array(8) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(8) "hostname"
  ["port"]=>
  int(9090)
  ["user"]=>
  string(8) "username"
  ["pass"]=>
  string(8) "password"
  ["path"]=>
  string(5) "/path"
  ["query"]=>
  string(9) "arg=value"
  ["fragment"]=>
  string(6) "anchor"
}

これによって接続されたURLを解析して host からベーシック認証時のユーザ、パスまで解析することが可能です。

解析したURLを再構成する

こちらを参考に再構成する方法を作成。
PHP: parse_url - Manual thomas at gielfeldt dot com

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php

$url = 'http://username:password@hostname:9090/path?arg=value#anchor';

// 再構成したURLが一致していることを確認
if ($url === unparseUrl(parse_url($url))) {
  print "YES, they match!\n";
}

/**
 * parseURL unparseURL
 * 
 * @param $parsed_url parse_url で解析した内容
 * @return string 再構成したURL
 */
function unparseUrl(array $parsed_url) :string
{
  $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
  $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
  $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
  $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
  $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
  $pass     = ($user || $pass) ? "$pass@" : '';
  $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
  $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
  $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
  return $scheme . $user . $pass . $host . $port . $path . $query . $fragment;
}

再構成の応用

たとえば host が変わったが同一のURLに遷移したい場合などがあります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

$url = 'http://username:password@hostname:9090/path?arg=value#anchor';

var_dump(unparse_url(parse_url($url)));

/**
 * parseURL unparseURL
 * 
 * @param $parsed_url parse_url で解析した内容
 * @return string 再構成したURL
 */
function unparseUrl(array $parsed_url) :string
{
  $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
  // hostをexampleに変更
  $host     = isset($parsed_url['host']) ? 'example' : '';
  $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
  $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
  $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
  $pass     = ($user || $pass) ? "$pass@" : '';
  $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
  $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
  $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
  return $scheme . $user . $pass . $host . $port . $path . $query . $fragment;
}

今回は host ですがクエリパラメータに何かを付与したい場合などさまざまな応用が可能です。

string(59) "http://username:password@example:9090/path?arg=value#anchor"

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer