2017-10-18 163 views
0

我想只提取从以下行的文件名中提取一个文件名:如何使用正则表达式从绝对路径

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

在这种情况下,预期的结果应该是“FONT-awesome.css” 我已经得到了这么远我的正则表达式:

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

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

什么M I缺失这里..

回答

2

试试这个正则表达式:

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

Click for Demo

说明:

  • (?<=\/) - 正回顾后发现立刻被前面的位置/
  • [^\s\/]* - 匹配0+这既不是一个空白字符也不是/
  • (?=\s*HTTP)任何字符的出现 - 正面先行以匹配直到其之后紧接着0+空格,随后HTTP的位置。
+0

的作品就像一个魅力。非常感谢。 – user1960170

0

虽然提取使用regex是可能的文件名,更容易为开始使用regex解压路径,然后使用basename()pathinfo()得到的文件名:

$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]; 
} 
0

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

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

说明:

[^\/]+?一个字符串,其前面的字符是/匹配。

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

Regex101 Demo