PHP正则表达式:提取文件名中的最后一个数字

时间:2012-12-28 18:37:42

标签: php regex

我需要一个正则表达式,并提取一个数字,该数字始终位于包含在()中的文件的末尾。

例如:

  

假期(1).png 返回1

     

假期(我和妈妈)(2).png 返回2

     

假期(5)(3).png 返回3

希望一些正则表达专业人士在那里:)

4 个答案:

答案 0 :(得分:4)

这应该这样做(demo on ideone.com):

preg_match( '/^.*\((\d+)\)/s', $filename, $matches );
$number = $matches[1];

贪婪的^.*会使正则表达式首先匹配尽可能多的字符,然后回溯直到它匹配\((\d+)\),即括号括起来的数字。

答案 1 :(得分:4)

只需写下来,$就是主题的结尾:

$pattern = '/\((\d+)\)\.png$/';
$number  = preg_match($pattern, $subject, $matches) ? $matches[1] : NULL;

这是一个所谓的锚定模式,它运行得非常好,因为正则表达式引擎知道从哪里开始 - 最后在这里。

这个疯狂模式的其余部分只是引用所有需要引用的字符:

(, ) and . => \(, \) and \. in:

().png     => \(\)\.png

然后将匹配组放入其中仅包含一个或多个(+)个数字\d

\((\d+)\)\.png
  ^^^^^

最后要使其正常工作,请添加$以标记结尾:

\((\d+)\)\.png$
              ^

准备好了。

答案 2 :(得分:1)

保持简单。使用preg_match_all

preg_match_all('/\((\d+)\)/', $filename, $m); 
$num=end(end($m));

答案 3 :(得分:0)

<?php
    $pattern = '/(.+)\((\d+)\)\.png/';
    $test1 = "Vacation LDJFDF(1).png";
    $test2 = "Vacation (Me and Mom) (2).png";
    $test3 = "Vacation (5)(3).png";

    preg_match($pattern, $test1, $matches);
    print $matches[2];
    print "\n";

    preg_match($pattern, $test2, $matches);
    print $matches[2];
    print "\n";

    preg_match($pattern, $test3, $matches);
    print $matches[2];
    print "\n";

?>

php test.php 1 2 3