如何使用绝对路径中的正则表达式提取文件名

时间:2017-10-18 05:41:53

标签: php regex

我试图从以下行中提取文件名:

"GET /mapitzend/public/components/font-awesome/css/font-awesome.css HTTP/1.1" 200 26651

在这种情况下,预期结果应为“font-awesome.css” 我的正则表达式让我走得很远:

\"(.[^\"]+)\s+HTTP

上面的正则表达式返回:“GET /mapitzend/public/components/font-awesome/css/font-awesome.css HTTP

我在这里错过了什么..

3 个答案:

答案 0 :(得分:2)

试试这个正则表达式:

(?<=\/)[^\s\/]*(?=\s*HTTP)

Click for Demo

<强>解释

  • (?<=\/) - 在/
  • 之后立即查找位置的正面观察
  • [^\s\/]* - 匹配任何字符的0+次出现,既不是空白字符也不是/
  • (?=\s*HTTP) - 匹配正向,直到紧跟0+空格后跟HTTP的位置。

答案 1 :(得分:0)

虽然可以使用regex提取文件名,但使用regex开始提取路径更容易,然后使用basename()pathinfo()获取文件名:< / p>

$line = '"GET /mapitzend/public/components/font-awesome/css/font-awesome.css HTTP/1.1" 200 26651';

$m = array();
if (preg_match('/GET (.*) HTTP/', $line, $m)) {
    $filename = basename($m[1]);
}

仅使用regex

if (preg_match('#GET /(.*/)*(.*) HTTP#', $line, $m)) {
    $filename = $m[2];
}

答案 2 :(得分:0)

使用具有特定扩展名的文件名属性,例如.css.html,您可以使用以下正则表达式。

正则表达式: [^\/]+?\.[a-z]+

<强>解释

[^\/]+?匹配前一个字符为/的字符串。

\.[a-z]+与扩展程序匹配,确保它是一个文件。

<强> Regex101 Demo