Subversion Repositories cheapmusic

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
25 - 1
<?php
2
/**
3
 * Copyright 2017 Facebook, Inc.
4
 *
5
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to
6
 * use, copy, modify, and distribute this software in source code or binary
7
 * form for use in connection with the web services and APIs provided by
8
 * Facebook.
9
 *
10
 * As with any software that integrates with the Facebook platform, your use
11
 * of this software is subject to the Facebook Developer Principles and
12
 * Policies [http://developers.facebook.com/policy/]. This copyright notice
13
 * shall be included in all copies or substantial portions of the software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
 * DEALINGS IN THE SOFTWARE.
22
 *
23
 */
24
namespace Facebook\Url;
25
 
26
/**
27
 * Class FacebookUrlManipulator
28
 *
29
 * @package Facebook
30
 */
31
class FacebookUrlManipulator
32
{
33
    /**
34
     * Remove params from a URL.
35
     *
36
     * @param string $url            The URL to filter.
37
     * @param array  $paramsToFilter The params to filter from the URL.
38
     *
39
     * @return string The URL with the params removed.
40
     */
41
    public static function removeParamsFromUrl($url, array $paramsToFilter)
42
    {
43
        $parts = parse_url($url);
44
 
45
        $query = '';
46
        if (isset($parts['query'])) {
47
            $params = [];
48
            parse_str($parts['query'], $params);
49
 
50
            // Remove query params
51
            foreach ($paramsToFilter as $paramName) {
52
                unset($params[$paramName]);
53
            }
54
 
55
            if (count($params) > 0) {
56
                $query = '?' . http_build_query($params, null, '&');
57
            }
58
        }
59
 
60
        $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : '';
61
        $host = isset($parts['host']) ? $parts['host'] : '';
62
        $port = isset($parts['port']) ? ':' . $parts['port'] : '';
63
        $path = isset($parts['path']) ? $parts['path'] : '';
64
        $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : '';
65
 
66
        return $scheme . $host . $port . $path . $query . $fragment;
67
    }
68
 
69
    /**
70
     * Gracefully appends params to the URL.
71
     *
72
     * @param string $url       The URL that will receive the params.
73
     * @param array  $newParams The params to append to the URL.
74
     *
75
     * @return string
76
     */
77
    public static function appendParamsToUrl($url, array $newParams = [])
78
    {
79
        if (empty($newParams)) {
80
            return $url;
81
        }
82
 
83
        if (strpos($url, '?') === false) {
84
            return $url . '?' . http_build_query($newParams, null, '&');
85
        }
86
 
87
        list($path, $query) = explode('?', $url, 2);
88
        $existingParams = [];
89
        parse_str($query, $existingParams);
90
 
91
        // Favor params from the original URL over $newParams
92
        $newParams = array_merge($newParams, $existingParams);
93
 
94
        // Sort for a predicable order
95
        ksort($newParams);
96
 
97
        return $path . '?' . http_build_query($newParams, null, '&');
98
    }
99
 
100
    /**
101
     * Returns the params from a URL in the form of an array.
102
     *
103
     * @param string $url The URL to parse the params from.
104
     *
105
     * @return array
106
     */
107
    public static function getParamsAsArray($url)
108
    {
109
        $query = parse_url($url, PHP_URL_QUERY);
110
        if (!$query) {
111
            return [];
112
        }
113
        $params = [];
114
        parse_str($query, $params);
115
 
116
        return $params;
117
    }
118
 
119
    /**
120
     * Adds the params of the first URL to the second URL.
121
     *
122
     * Any params that already exist in the second URL will go untouched.
123
     *
124
     * @param string $urlToStealFrom The URL harvest the params from.
125
     * @param string $urlToAddTo     The URL that will receive the new params.
126
     *
127
     * @return string The $urlToAddTo with any new params from $urlToStealFrom.
128
     */
129
    public static function mergeUrlParams($urlToStealFrom, $urlToAddTo)
130
    {
131
        $newParams = static::getParamsAsArray($urlToStealFrom);
132
        // Nothing new to add, return as-is
133
        if (!$newParams) {
134
            return $urlToAddTo;
135
        }
136
 
137
        return static::appendParamsToUrl($urlToAddTo, $newParams);
138
    }
139
 
140
    /**
141
     * Check for a "/" prefix and prepend it if not exists.
142
     *
143
     * @param string|null $string
144
     *
145
     * @return string|null
146
     */
147
    public static function forceSlashPrefix($string)
148
    {
149
        if (!$string) {
150
            return $string;
151
        }
152
 
153
        return strpos($string, '/') === 0 ? $string : '/' . $string;
154
    }
155
 
156
    /**
157
     * Trims off the hostname and Graph version from a URL.
158
     *
159
     * @param string $urlToTrim The URL the needs the surgery.
160
     *
161
     * @return string The $urlToTrim with the hostname and Graph version removed.
162
     */
163
    public static function baseGraphUrlEndpoint($urlToTrim)
164
    {
165
        return '/' . preg_replace('/^https:\/\/.+\.facebook\.com(\/v.+?)?\//', '', $urlToTrim);
166
    }
167
}