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];

greedy^.*により、正規表現は最初にできるだけ多くの文字に一致し、次に一致するまでバックトラック\((\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

そして、1 つ以上の ( +) 数字のみを含むように、一致するグループがそこに配置され\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 に答える