Regex从URL中提取文件扩展名


Regex to extract file extension from URL

我正在以下URI中寻找与.js匹配的正则表达式:

 /foo/bar/file.js?cache_key=123

我正在编写一个函数,试图识别作为参数传入的文件类型。在这种情况下,该文件的扩展名为.js,是一个javascript文件。我正在使用PHP和preg_match,所以我假设这是一个PCRE兼容的正则表达式。最终,我将在这个表达式的基础上进行构建,并能够检查作为URI传递的多个文件类型,该URI不仅限于js,还可能限于css、image等。

您可以使用pathinfo和正则表达式的组合。pathinfo将为您提供扩展名加上?cache_key=123,然后您可以使用与?及其后的所有内容匹配的正则表达式删除?cache_key=123

$url = '/foo/bar/file.js?cache_key=123';
echo preg_replace("#'?.*#", "", pathinfo($url, PATHINFO_EXTENSION)) . "'n";

输出:

js

输入:

$url = 'my_style.css?cache_key=123';

输出:

css

显然,如果您需要.,那么将其添加到文件扩展名字符串中是很简单的。

ETA:如果你确实想要一个正则表达式解决方案,这将起到关键作用:

function parseurl($url) {
    # takes the last dot it can find and grabs the text after it
    echo preg_replace("#(.+)?'.('w+)('?.+)?#", "$2", $url) . "'n";
}
parseurl('my_style.css');
parseurl('my_style.css?cache=123');
parseurl('/foo/bar/file.js?cache_key=123');
parseurl('/my.dir.name/has/dots/boo.html?cache=123');

输出:

css
css
js
html

使用:

.+'.(js|css|etc)[?]?

$matches[1]中的扩展

或者你可以直接使用

.+'.(js|css|etc)'?

如果是决赛?隐藏物总是使用

DEMO

代码

$input_line = '/foo/bar/file.js?cache_key=123';
// lets grab the part part between filename and ?
preg_match("/'w+'/'w+'/'w+(.*)'?/", $input_line, $output_array);
var_dump($matches);
echo $matches[0]; 

输出

Array
(
   [0] => foo/bar/file.js?
   [1] => .js
)

.js

如果您事先知道扩展(白名单方法),您可能会从匹配所有(.*)切换到匹配特定扩展/.*'.(js|jpg|jpeg|png|gif)/

preg_match("/.*'.(js|jpg|jpeg|png|gif)/", $input_line, $matches);
echo $matches[1]; // js