/**
 * A wrapper for PHP's parse_url() function that handles consistency in the return
 * values across PHP versions.
 *
 * PHP 5.4.7 expanded parse_url()'s ability to handle non-absolute url's, including
 * schemeless and relative url's with :// in the path. This function works around
 * those limitations providing a standard output on PHP 5.2~5.4+.
 *
 * Secondly, across various PHP versions, schemeless URLs starting containing a ":"
 * in the query are being handled inconsistently. This function works around those
 * differences as well.
 *
 * Error suppression is used as prior to PHP 5.3.3, an E_WARNING would be generated
 * when URL parsing failed.
 *
 * @since 4.4.0
 * @since 4.7.0 The $component parameter was added for parity with PHP's parse_url().
 *
 * @param string $url       The URL to parse.
 * @param int    $component The specific component to retrieve. Use one of the PHP
 *                          predefined constants to specify which one.
 *                          Defaults to -1 (= return all parts as an array).
 *                          @see http://php.net/manual/en/function.parse-url.php
 * @return mixed False on parse failure; Array of URL components on success;
 *               When a specific component has been requested: null if the component
 *               doesn't exist in the given URL; a sting or - in the case of
 *               PHP_URL_PORT - integer when it does. See parse_url()'s return values.
 */
function wp_parse_url($url, $component = -1)
{
    $to_unset = array();
    $url = strval($url);
    if ('//' === substr($url, 0, 2)) {
        $to_unset[] = 'scheme';
        $url = 'placeholder:' . $url;
    } elseif ('/' === substr($url, 0, 1)) {
        $to_unset[] = 'scheme';
        $to_unset[] = 'host';
        $url = 'placeholder://placeholder' . $url;
    }
    $parts = @parse_url($url);
    if (false === $parts) {
        // Parsing failure.
        return $parts;
    }
    // Remove the placeholder values.
    foreach ($to_unset as $key) {
        unset($parts[$key]);
    }
    return _get_component_from_parsed_url_array($parts, $component);
}
 /**
  * @ticket 36356
  *
  * @dataProvider get_component_from_parsed_url_array_testcases
  */
 function test_get_component_from_parsed_url_array($url, $component, $expected)
 {
     $parts = wp_parse_url($url);
     $actual = _get_component_from_parsed_url_array($parts, $component);
     $this->assertSame($expected, $actual);
 }