() で囲まれたファイルの末尾に常にある番号を抽出する正規表現が必要です。
例えば:
休暇 (1).pngは 1 を返します
休暇 (私と母) (2).pngは 2 を返します
休暇 (5) (3).pngは 3 を返します
いくつかの正規表現のプロがそこにいることを願っています:)
これでうまくいくはずです(ideone.comのデモ):
preg_match( '/^.*\((\d+)\)/s', $filename, $matches );
$number = $matches[1];
greedy^.*
により、正規表現は最初にできるだけ多くの文字に一致し、次に一致するまでバックトラック\((\d+)\)
します。つまり、括弧で囲まれた数字です。
それを書くだけ$
で、主題の終わりです:
$pattern = '/\((\d+)\)\.png$/';
$number = preg_match($pattern, $subject, $matches) ? $matches[1] : NULL;
これはいわゆる固定パターンです。正規表現エンジンはどこから開始すればよいか (ここが最後) を認識しているため、非常にうまく機能します。
このクレイジーなパターンの残りの部分は、引用が必要なすべての文字を引用するだけです。
(, ) and . => \(, \) and \. in:
().png => \(\)\.png
そして、1 つ以上の ( +
) 数字のみを含むように、一致するグループがそこに配置され\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