我需要一个正则表达式,并提取一个数字,该数字始终位于包含在()中的文件的末尾。
例如:
假期(1).png 返回1
假期(我和妈妈)(2).png 返回2
假期(5)(3).png 返回3
希望一些正则表达专业人士在那里:)
答案 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