我需要一个正则表达式来提取一个数字,该数字始终位于包含在 () 中的文件的末尾。
例如:
假期 (1).png返回 1
假期(我和妈妈) (2).png返回 2
假期 (5) (3).png返回 3
希望一些正则表达式专家在那里:)
应该这样做(ideone.com 上的演示):
preg_match( '/^.*\((\d+)\)/s', $filename, $matches );
$number = $matches[1];
贪婪^.*
导致正则表达式首先匹配尽可能多的字符,然后回溯直到它可以匹配\((\d+)\)
,即用括号括起来的数字。
就这么写吧,$
就是主题的结尾:
$pattern = '/\((\d+)\)\.png$/';
$number = preg_match($pattern, $subject, $matches) ? $matches[1] : NULL;
这是一种所谓的锚定模式,它工作得很好,因为正则表达式引擎知道从哪里开始 - 在这里结束。
这个疯狂模式的其余部分只是引用所有需要引用的字符:
(, ) and . => \(, \) and \. in:
().png => \(\)\.png
然后将一组匹配项放入其中,仅包含一个或多个 ( +
) 数字\d
:
\((\d+)\)\.png
^^^^^
最后要让这个工作,添加$
标记结束:
\((\d+)\)\.png$
^
准备运行。
把事情简单化。使用preg_match_all
preg_match_all('/\((\d+)\)/', $filename, $m);
$num=end(end($m));
<?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