正则表达式从URL中提取文件扩展名

时间:2014-10-30 23:06:56

标签: php regex

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

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

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

3 个答案:

答案 0 :(得分:6)

您可以使用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

答案 1 :(得分:1)

使用:

.+\.(js|css|etc)[?]?
$ match [1]

中的

扩展名

或者您可以使用

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

如果始终使用最终的缓存...

答案 2 :(得分:0)

<强> 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