2011-03-09 2 views
0

私は、正規表現の2番目に単純な型(いくつかの文字列から一致する文字列を抽出し、それを使用する)を考えていたものをハッキングするが、正規表現のグループ化は、 。php最も単純な正規表現の置き換えだけどbacktracesは動作しない

目的

  1. コマンドが正しい名前形式を持っているファイルをコピー/フォーマットする、出力をファイルのlsを取ります。
  2. ファイルのサイズを変更してサムネイルを作成します。私は結果を得るとき、私はちょうど、単一の正規表現のグループ以外のすべてをフィルタリングしたいがため

失敗

は私のコードでは、正規表現の段階で失敗した(でもまだそのステップを扱っていません)それは、私が決して最初のバックトレースグループを要求していなくても、私が望むグループとそれ以前のグループを常に返しています。私はそれがすべてでは問題を期待していませんが、 http://ideone.com/2RiqN

をそしてここで切り倒した初期データセットとコード(ある:ここで

は、オンラインIDE上のコードの完全に機能する、実行可能なバージョンです。 ):正規表現のための

<?php 

// Long list of image names. 
$file_data = <<<HEREDOC 
07184_A.jpg 
Adrian-Chelsea-C08752_A.jpg 
Air-Adams-Cap-Toe-Oxford-C09167_A.jpg 
Air-Adams-Split-Toe-Oxford-C09161_A.jpg 
Air-Adams-Venetian-C09165_A.jpg 
Air-Aiden-Casual-Camp-Moc-C09347_A.jpg 
C05820_A.jpg 
C06588_A.jpg 
Air-Aiden-Classic-Bit-C09007_A.jpg 
Work-Moc-Toe-Boot-C09095_A.jpg 
HEREDOC; 

if($file_data){ 
    $files = preg_split("/[\s,]+/", $file_data); 
    // Split up the files based on the newlines. 
} 
$rename_candidates = array(); 
$i = 0; 
foreach($files as $file){ 
    $string = $file; 
    $pattern = '#(\w)(\d+)_A\.jpg$#i'; 
    // Use the second regex group for the results. 
    $replacement = '$2'; 
    // This should return only group 2 (any number of digits), but instead group 1 is somehow always in there. 
    $new_file_part = preg_replace($pattern, $replacement, $string); 
// Example good end result: <img src="images/ch/ch-07184fs.jpg" width="350" border="0"> 
    // Save the rename results for further processing later. 
    $rename_candidates[$i]=array('file'=>$file, 'new_file'=>$new_file_part); 
    // Rename the images into a standard format. 
    echo "cp ".$file." ./ch/ch-".$new_file_part."fs.jpg;"; 
     // Echo out some commands for later. 
    echo "<br>"; 
    $i++; 
    if($i>10){break;} // Just deal with the first 10 for now. 
} 
?> 

意図する結果:788750 コード出力)の(複数行のための結果を対象:CP空気何か代-C485850_A.jpg ./ch/ch-485850.jpg。

私の正規表現で何が問題になっていますか?より簡単なマッチングコードの提案も高く評価されます。

+0

コードの外見から、 '_A.jpg'と' C'文字は切り捨てられますが、最初の部分のファイル名と番号は残ります。これはあなたが意図したものですか? (あなたは何が起こったのか、何が期待されたのかを例証しなかった。) – mario

+0

あなたの失敗は、オペレーティングシステムコマンドの広告のinfinitemの導入、出力の中断、および誰かが正規表現の問題を修正できるようになることを期待することによってもたらされます。システムのロジスティクスを忘れて、あなたの投稿に正規表現の領域を残してください。正規表現でのみ期待されるテキストと結果。 – sln

答えて

1

スキャンディレクトリとエクスプロイト

あなたは何を知っていますか?基本的にblah-2.jpgのようなファイル名がarray('blah','2.jpg);になっていると、そののend()を服用すると、最後の要素を取得します:PHPでそれを行うための簡単な方法は、爆発SCANDIRを使用してコンボに

$dir = scandir('/path/to/directory'); 
    foreach($dir as $file) 
{ 
    $ext = pathinfo($file,PATHINFO_EXTENSION); 
    if($ext!='jpg') continue; 

    $a = explode('-',$file); //grab the end of the string after the - 
    $newfilename = end($a); //if there is no dash just take the whole string 

    $newlocation = './ch/ch-'.str_replace(array('C','_A'),'', basename($newfilename,'.jpg')).'fs.jpg'; 
    echo "@copy($file, $newlocation)\n"; 

} 
#and you are done :) 

を爆発することです。これはarray_pop()とほぼ同じです。

実施例

ここに私のideaoneコードhttp://ideone.com/gLSxA

+0

いいえこれは常に終了セグメントを取るためではありません。 – Jason

+0

これはうまくいくでしょう、ありがとう。 – Kzqai

+0

このすべての混乱は、「Scan Dir」というタグが付けられていたはずです – sln

2

ただの推測です:

$pattern = '#^.*?(\w)(\d+)_A\.jpg$#i'; 

これは、試合全体のファイル名を含んでいます。それ以外の場合はpreg_replace()は実際には各文字列の末尾に置き換えられます。実際に一致した部分には$replacementという式だけが適用されます。

+0

+1の素敵な推測私は – sln

+0

Ach、その新しい正規表現もうまく動作すると思います。 – Kzqai

関連する問題