0

悲しいことに、私はこの質問をしなければなりませんが、午前中この問題にうなずいた後、私はあきらめます。オンライン、マニュアルページ、ドキュメントを検索しても、私がやろうとしていることに対する決定的な答えは得られないようです。

文字列をパターンと照合するためのPHP関数preg_matchの正規表現を探しています。今、そのパターンは私に頭痛を与えるものです。

パターンは次のように表現する必要があります。文字列は「_MG_」または「IMG_」または「DSC_」で始まり、4桁の数字が続き、オプションの「-N」が続きます。Nは別の数字です。たとえば、「IMG_0123」または「DSC_9876-3」は有効です。それ以外はすべて拒否する必要があります。

いろいろなパターンを思いついたのですが、どれもうまくいかないようです。たとえば、私は試しました

(_MG_|IMG_|DSC_)[0-9]{4}(-[0-9])?

これは、さまざまな部分式の周りに()とアポストロフィを使用してさまざまなバリエーションで使用し、?を使用します。vs{0,1}など。(grepを使用して実験しましたが、まだ一致するものはありません。)はい、PHPの場合は「/.../」を追加する必要があることはわかっていますが、読みやすくするためにここでは省略しました。

これを単一の式で表現することもできますか、それともマッチング関数を数回呼び出す必要がありますか?複数の一致が必要な場合は、自分自身に一致するこの特定の文字列に対して小さなパーサーを作成する方がよい場合があります。

ありがとう!

編集:これが私が使っているコードです

// Iterate over all images in this gallery folder.
if ($h = opendir($dir)) {
  while (($f = readdir($h)) !== false) {

    // Skip images whose name doesn't match the requirement.
    if (0 == preg_match("/(_MG_|IMG_|DSC_)[0-9]{4}(-[0-9]){0,1}/", $f)) {
      continue;
    }

    ...
  }
}

また、これにより、「_ MG_7020-1-2.jpg」、「_ MG_7444-5-6.2.jpg」、「IMG_6543_2_4_tonemapped.jpg」などの画像名も使用できるようになりますが、これは許可したいことではありません。

4

3 に答える 3

0
<?php

    $array = array('IMG_0123', 'DSC_9876-3', '_MG_1234', 'DSC_fail');

    foreach($array as $arr) {
        if(preg_match("/_MG_|IMG_|DSC_[0-9]{4}[-0-9]*/", $arr)) {
            echo $arr . ' => TRUE <br />';
        } else {
            echo $arr . ' => FALSE <br />';
        }
    }
?>

上記は私にとって期待通りに機能します。

于 2012-06-22T18:49:25.703 に答える
0

この reiddleによると、問題なく解決したようです。「単体」テスト機能を使用して、追加の「すべき」および「すべきでない」シナリオに一致させることができます。確かに、そのリドルはjavascriptの正規表現を使用していますが、後方参照とルックアラウンドに入るまで、それらは事実上同一であることがわかりました。

于 2012-06-22T19:11:29.897 に答える
0

私もこれを実行しました:

<?php
$matches = array();
preg_match('/(_MG_|IMG_|DSC_)[0-9]{4}(-[0-9])?/','IMG_0123-3',$matches );

var_dump($matches);

出力:

array(3) {
  [0]=>
  string(10) "IMG_0123-3"
  [1]=>
  string(4) "IMG_"
  [2]=>
  string(2) "-3"
}

私が何かを見逃していない限り、またはあなたが言及しているのは、すべてのマッチャー () が一致しない場合に preg_match が false を返すということでない限り、問題ないようです。

php doc の preg_match の戻り値の型に注意してください。

preg_match() は、パターンが一致した回数を返します。preg_match() は最初の一致後に検索を停止するため、これは 0 回 (一致なし) または 1 回のいずれかになります。逆に preg_match_all() は対象の最後まで続きます。エラーが発生した場合、preg_match() は FALSE を返します。

したがって、実際に preg_match_all() を実際に使用することを検討している可能性があります

于 2012-06-22T18:59:33.087 に答える