<?php
/**
* Deep replace of strings in an array or string.
*
* @since 0.0.2
*
* @param string $subject
* @param string $search
*
* @return string The processed string.
*/
function _deep_replace($subject, $search)
{
$subject = (string) $subject;
$count = 1;
while ($count) {
$subject = str_replace($search, '', $subject, $count);
}
return $subject;
}
/**
* 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.
*
* @since 0.0.2
*
* @link https://www.php.net/manual/en/function.parse-url.php
*
* @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).
* @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 string or - in the case of
* PHP_URL_PORT - integer when it does. See parse_url()'s return values.
*/
function parse_url_string($url, $component = -1)
{
$to_unset = array();
$url = (string) $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($parts, $component);
}
/**
* Retrieve a specific component from a parsed URL array.
*
* @internal
*
* @since 0.0.2
* @access private
*
* @link https://www.php.net/manual/en/function.parse-url.php
*
* @param array|false $url_parts The parsed URL. Can be false if the URL failed 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).
* @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 string or - in the case of
* PHP_URL_PORT - integer when it does. See parse_url()'s return values.
*/
function _get_component_from_parsed_url($url_parts, $component = -1)
{
if (-1 === $component) {
return $url_parts;
}
$key = _translate_php_url_constant_to_key($component);
if (false !== $key && is_array($url_parts) && isset($url_parts[$key])) {
return $url_parts[$key];
} else {
return null;
}
}
/**
* Translate a PHP_URL_* constant to the named array keys PHP uses.
*
* @internal
*
* @since 0.0.2
* @access private
*
* @link https://www.php.net/manual/en/url.constants.php
*
* @param int $constant PHP_URL_* constant.
* @return string|false The named key or false.
*/
function _translate_php_url_constant_to_key($constant)
{
$translation = array(
PHP_URL_SCHEME => 'scheme',
PHP_URL_HOST => 'host',
PHP_URL_PORT => 'port',
PHP_URL_USER => 'user',
PHP_URL_PASS => 'pass',
PHP_URL_PATH => 'path',
PHP_URL_QUERY => 'query',
PHP_URL_FRAGMENT => 'fragment',
);
if (isset($translation[$constant])) {
return $translation[$constant];
} else {
return false;
}
}
/**
* Get allowed protocols for URLs.
*
* @since 0.0.2
*
* @return array Array of allowed protocols.
*/
function get_allowed_protocols()
{
return array('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'irc6', 'ircs', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'sms', 'svn', 'tel', 'fax', 'xmpp', 'webcal', 'urn');
}
|