2014-01-21 65 views
0

我不太擅长正则表达式,但我会怎么去分割文件名与路径的扩展名?PHP的正则表达式来从URL中获取文件名

d:/DCIM/image10.jpg

d:/DCIM/image11.jpg

d:/DCIM/image12.jpg

d:/DCIM/image13.jpg

我会从彼此的imagex.jpg关于字符串,x是一个数字。

因此,基本上搜索“.jpg”,然后获取所有其他字符,直到“/”。

编辑: 阿PATHINFO功能将做的工作,但它会很高兴地知道该怎么做这样的事情为今后目的的正则表达式。

+7

http://php.net/manual/en/function.pathinfo.php – zerkms

+0

请提供更多输入示例以及预期输出结果。 –

+0

你有可能会希望[目录名(http://uk1.php.net/manual/en/function.dirname.php)。 – t31os

回答

0

正则表达式非常复杂,特别是对于这类任务,所以我不得不建议避免使用它们,因为这是不好的做法,除非您绝对必须这样做。

最好的选择是要么使用爆炸简单。

$parts = explode('/', $url); 

现在$parts[count($parts) - 1]将包含文件名。

或者使用pathinfo

$filename = pathinfo($url, PATHINFO_FILENAME); 

现在$filename包含文件名。

这就是说,如果你知道完整的路径,你可以使用str_replace甚至substr。所有选项都有点混乱,但它们比正则表达式要好。

2

从PHP手册:

可以使用pathinfo功能

<?php 

$path = pathinfo('D:/DCIM/image10.jpg'); 
echo $path['filename']; 

?> 

,或者您可以使用basename功能与扩展得到它没有赶上从PATHINFO两者(文件名和扩展名)困扰结果数组:

<?php 
echo basename('D:/DCIM/image10.jpg'); 
?> 

祝你好运!

编辑

如果你坚持,试试这个

<?php 

$files = array(
    "D:/DCIM/image11.jpg", 
    "C:\xampp\htdocs\index.php", 
    "/usr/local/script.sh" 
); 

foreach ($files as $file) { 
    preg_match("/[^\/|\\\]+$/", $file, $matches); 
    var_dump($matches); 
} 
?> 



[^\/|\\\] 

意味着你开始寻找一个斜线,以逃避斜线字符反斜杠

[^\/ 

或者您开始​​搜索用反斜杠转义反斜杠和括号字符的反斜杠。

|\\\] 

最后,您在给定字符串的末尾搜索至少一次任何内容。

+$ 

我把这个概念从这个post
我希望它能帮助!

+0

只要注意utf-8文件名。看到这个bug https://bugs.php.net/bug.php?id=47954 – Lewis

+0

在使用这个函数的人的php版本中有效的测试这个用例(UTF-8文件名)。就我而言,像冠军一样工作!感谢提示@Orion –

0

如果你想使用正则表达式,使用preg_match_all[^/]+\b$。我会把细节留给你。我个人会使用pathinfo由zerkms发布。

This RegEx寻找一组字符不是 a“/”,并在字符串末尾处继续。