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

4
我正在寻找一个正则表达式,可以匹配以下URI中的.js
 /foo/bar/file.js?cache_key=123

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

3个回答

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

显然,如果你需要.,将其添加到文件扩展名字符串是微不足道的。

注:如果你确实需要正则表达式解决方案,这个可以达到目的:

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

使用:

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

在 $matches[1] 中的扩展名

或者你可以直接使用

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

如果最终的?cache...总是被使用。

0

演示

代码

$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

这个解决方案相当依赖于有一定数量的目录... - i alarmed alien
返回翻译的文本:/word/word/word(match)?也许这就足够了。谁知道呢。总有pathinfo()的方法。 - Jens A. Koch
1
你可以使用 (\/\w+)* 来使目录数量变得灵活 -- 匹配 0 或多个 /\w+ - i alarmed alien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接