12

パスと 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';
}
4

7 に答える 7

5

絶対パスと URL

正解です。Linux の絶対 URL は で始まる必要が/あるため、パスの先頭にあるスラッシュを確認するだけで十分です。

http://とをチェックする必要がある URL については、あなたが書いたように、ただし、 、 、https://で始まる URL は他にもあります。そのため、どの範囲の用途をカバーしたいかによって大きく異なります。ftp://sftp://smb://

無効なパスと URL

Linux について言及していると仮定すると、パスで禁止されている文字は/\0. これは実際にはファイルシステムに大きく依存しますが、ほとんどの用途で上記が正しいと想定できます。

Windows では、より複雑です。これについては、解説の下のPath.GetInvalidPathChars メソッドのドキュメントを参照してください。

URL は Linux パスよりも複雑です。使用できる文字は, A-Z, a-z, 0-9, -, ., _, ~, :, /, ?, #, [, ], @, !,$および(別の回答で説明されているとおり)のみです&'()*+,;=

相対パスと URL

一般に、絶対的でも無効でもないパスと URL は相対的です。

于 2011-09-12T19:13:43.670 に答える
3

この関数は 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);
}
于 2016-09-25T00:47:22.883 に答える
2

私は最近、URL が相対か絶対か (そしてもちろんそれ以上) をチェックするのに役立つかもしれない composer パッケージを開始しました。

ここでリポジトリを確認してください: https://github.com/Enrise/UriHelper またはここで composer 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
于 2015-04-21T09:12:46.393 に答える
2

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)
    ;
}
于 2016-11-09T17:42:27.357 に答える
2

使用する:

function isAbsolute($url) {
  return isset(parse_url($url)['host']);
}

説明:

ホストが設定されている場合、パスは絶対パスです。

例えば:

$test = [
'/link?param=1'=>parse_url('/assa?ass'),
'//aaa.com/link?param=1'=>parse_url('//assa?ass'),
'http://aaa.com/link?param=1'=>parse_url('http://as.plassa?ass')
];
var_export($test);

/* Output:
[
  "/link?param=1" => array:2 [▼ // Not absolute
    "path" => "/assa"
    "query" => "ass"
  ]
  "//aaa.com/link?param=1" => array:2 [▼ // Absolute because of host
    "host" => "assa"
    "query" => "ass"
  ]
  "http://aaa.com/link?param=1" => array:3 [▼ // Absolute because of host
    "scheme" => "http"
    "host" => "as.plassa"
    "query" => "ass"
  ]
]
*/
于 2020-09-30T09:54:41.220 に答える