2017-10-18 48 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