我试图从以下行中提取文件名:
"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
我在这里错过了什么..
答案 0 :(得分:2)
试试这个正则表达式:
(?<=\/)[^\s\/]*(?=\s*HTTP)
<强>解释强>
(?<=\/)
- 在/
[^\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 强>