我正在以下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