我正在寻找与以下URI中的.js
匹配的正则表达式:
/foo/bar/file.js?cache_key=123
我正在编写一个函数,尝试识别作为参数传入的文件类型。在这种情况下,文件以扩展名.js
结尾,并且是一个javascript文件。我正在使用PHP和preg_match所以我假设这是一个PCRE兼容的正则表达式。最终,我将构建此表达式,并能够检查多个文件类型,这些文件类型作为URI传递,不仅限于js,还可能是css,图像等。
答案 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