如果文件 url 具有特定的扩展名,正则表达式会发现啥

Posted

技术标签:

【中文标题】如果文件 url 具有特定的扩展名,正则表达式会发现啥【英文标题】:What regex would find out if file url has certain extension如果文件 url 具有特定的扩展名,正则表达式会发现什么 【发布时间】:2011-06-06 07:52:53 【问题描述】:

我的有效网址可能或多或少像这样

http://someurl.com/some/path/file.pdf
or 
http://someurl.com/some/path/file.pdf?param=value
or 
http://someurl.com/some/path/file.pdf?param=value&second=val

文件扩展名可以是 .pdf,或其他扩展名,如 .jpg 或 .psd,或者什么都没有。

我存储的 url 没有 someurl.com 部分,所以它是 url 的 some/path/file.pdf 部分

如果存在,我如何使用正则表达式来了解文件扩展名?正则表达式是解决此问题的正确工具吗?

【问题讨论】:

技术上的 URL(统一 资源 定位器)没有 "extensions",因为它们不是文件,或者不一定。要找出资源/媒体类型,get_headers() 会更正确。但是 OTOH 当然,它大部分时间都有效.. 【参考方案1】:

我会使用parse_url()pathinfo()。这些是最适合这项工作的功能。

$url = 'http://someurl.com/some/path/file.pdf?param=value';

$path = parse_url($url, php_URL_PATH);

$ext = pathinfo($path, PATHINFO_EXTENSION);

var_dump($ext); // string(3) "pdf"

See is on CodePad.org.

可以使用正则表达式,但会更难遵循。

【讨论】:

【参考方案2】:

您可能需要执行 HTTP HEAD 请求。正则表达式肯定会起作用,但不能保证你能捕捉到所有情况。

例如:

http://someurl.com/some/path/file 可能是一个没有扩展名的文本文件(就像在大多数 *nix 系统上一样),并且正则表达式将无法提供文件扩展名。

【讨论】:

【参考方案3】:

更好的选择是 PHP 的 parse_url 函数:

$path = parse_url($url, PHP_URL_PATH);
$extension = ($pos = strrpos($path, '.')) ? substr($path, $pos) : "";

【讨论】:

【参考方案4】:

不需要正则表达式,我们可以使用parse_url

$url = parse_url('http://example.com/path/to/file.php?param=value');

$extension = substr($url['path'], strrpos($url['path'], '.') + 1);
echo $extension; // outputs "php"

http://php.net/parse-url

http://php.net/substr

http://php.net/strrpos

【讨论】:

以上是关于如果文件 url 具有特定的扩展名,正则表达式会发现啥的主要内容,如果未能解决你的问题,请参考以下文章

经典 ASP 中的正则表达式,以确定 URL 是不是具有特定字符串

使用 Bamboo SCP 任务排除具有特定扩展名的文件的语法是啥?

正则表达式:从没有文件扩展名的 URL 捕获文件名

python使用正则表达式寻找具有特定后缀的文件

可选文件扩展名的正则表达式匹配

如何使用正则表达式查找具有特定起始字符串的所有匹配项? [复制]