4

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

例如:

假期 (1).png返回 1

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

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

希望一些正则表达式专家在那里:)

4

4 回答 4

4

应该这样做(ideone.com 上的演示):

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

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

于 2012-12-28T18:39:47.683 回答
4

就这么写吧,$就是主题的结尾:

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

这是一种所谓的锚定模式,它工作得很好,因为正则表达式引擎知道从哪里开始 - 在这里结束。

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

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

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

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

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

最后要让这个工作,添加$标记结束:

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

准备运行。

于 2012-12-28T18:47:16.753 回答
1

把事情简单化。使用preg_match_all

preg_match_all('/\((\d+)\)/', $filename, $m); 
$num=end(end($m));
于 2012-12-28T18:48:05.413 回答
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

于 2012-12-28T18:58:06.097 回答