Проверка относительных и абсолютных путей / URL в PHP - PullRequest
7 голосов
/ 12 сентября 2011

Мне нужно реализовать функции, чтобы проверить, являются ли пути и URL-адреса относительными, абсолютными или недопустимыми (неверно синтаксически - не существует ли ресурс). Каков диапазон случаев, которые я должен искать?

function check_path($dirOrFile) {
    // If it's an absolute path: (Anything that starts with a '/'?)
        return 'absolute';
    // If it's a relative path: 
        return 'relative';
    // If it's an invalid path:
        return 'invalid';
}

function check_url($url) {
    // If it's an absolute url: (Anything that starts with a 'http://' or 'https://'?)
        return 'absolute';
    // If it's a relative url:
        return 'relative';
    // If it's an invalid url:
        return 'invalid';
}

Ответы [ 5 ]

5 голосов
/ 12 сентября 2011

Абсолютные пути и URL

Вы правы, абсолютные URL-адреса в Linux должны начинаться с /, поэтому проверки косой черты в начале пути будет достаточно.

Для URL-адресов вам необходимо проверить http:// и https://, поскольку вы написали, однако, есть и другие URL-адреса, начинающиеся с ftp://, sftp:// или smb://. Так что это очень зависит от того, какой диапазон использования вы хотите охватить.

Неправильные пути и URL-адреса

При условии, что вы имеете в виду Linux, единственными символами, которые запрещены в пути, являются / и \0. Это на самом деле очень зависит от файловой системы, однако, вы можете предположить, что вышеупомянутое будет правильным для большинства случаев использования.

В Windows все сложнее. Вы можете прочитать об этом в документации по методу Path.GetInvalidPathChars под примечаниями.

URL-адреса более сложны, чем пути Linux, так как единственные допустимые символы: A-Z, a-z, 0-9, -, ., _, ~, :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ; и = (как описано в другом ответе здесь ).

Относительные пути и URL

Обычно пути и URL-адреса, которые не являются ни абсолютными, ни недействительными, являются относительными.

3 голосов
/ 19 июля 2017

Поскольку я не могу комментировать ответы из-за своей плохой репутации, мне приходится отвечать на ответ ymakux функцией, скопированной им из библиотеки Drupal.

Я использую эту функцию, и я обнаружил, что URL с частью запроса (текст после символа?), Который содержит | символ будет оценен как ложный

например:

https://example.com/image.jpeg?fl=res,749,562,3|shr,,20|jpg,90

Будет оценено как ложное.

Все, что вам нужно сделать, это добавить

\ |

Для запроса части регулярного выражения, чтобы функция выглядела следующим образом:

public static function isAbsoluteUrl($url)
    {
        $pattern = "/^(?:ftp|https?|feed)?:?\/\/(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)*
        (?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@)?(?:
        (?:[a-z0-9\-\.]|%[0-9a-f]{2})+|(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\]))(?::[0-9]+)?(?:[\/|\?]
        (?:[\w#!:\.\?\+\|=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)?$/xi";

        return (bool) preg_match($pattern, $url);
    }

Надеюсь, это кому-нибудь поможет:)

2 голосов
/ 21 апреля 2015

Я недавно запустил пакет composer, который может быть полезен для проверки того, являются ли URL-адреса относительными / абсолютными (и более того, конечно).

Проверьте репозиторий здесь: https://github.com/Enrise/UriHelper ИлиКомпозитор Packagists пакет здесь: https://packagist.org/packages/enrise/urihelper

Некоторые примеры:

$uri = new \Enrise\Uri('http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment');
echo $uri->getScheme(); // http
echo $uri->getUser(); // usr
echo $uri->getPass(); // pss
echo $uri->getHost(); // example.com
echo $uri->getPort(); // 81
echo $uri->getPath(); // /mypath/myfile.html
echo $uri->getQuery(); // a=b&b[]=2&b[]=3
echo $uri->getFragment(); // myfragment
echo $uri->isSchemeless(); // false
echo $uri->isRelative(); // false

$uri->setScheme('scheme:child:scheme.VALIDscheme123:');
$uri->setPort(null);

echo $uri->getUri(); //scheme:child:scheme.VALIDscheme123:usr:pss@example.com/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment
1 голос
/ 09 ноября 2016

С Компонент Symfony FileSystem , чтобы проверить, является ли путь абсолютным:

public function isAbsolutePath($file)
{
    return strspn($file, '/\\', 0, 1)
        || (strlen($file) > 3 && ctype_alpha($file[0])
            && substr($file, 1, 1) === ':'
            && strspn($file, '/\\', 2, 1)
        )
        || null !== parse_url($file, PHP_URL_SCHEME)
    ;
}
1 голос
/ 25 сентября 2016

Эта функция взята из Drupal

public function is_absolute($url)
{
    $pattern = "/^(?:ftp|https?|feed):\/\/(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)*
    (?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@)?(?:
    (?:[a-z0-9\-\.]|%[0-9a-f]{2})+|(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\]))(?::[0-9]+)?(?:[\/|\?]
    (?:[\w#!:\.\?\+=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)?$/xi";

    return (bool) preg_match($pattern, $url);
}
...