开发者

php simplest case regex replacement, but backtraces not working

Hacking up what I thought was the second simplest type of regex (extract a matching string from some strings, and use it) 开发者_StackOverflow社区in php, but regex grouping seems to be tripping me up.

Objective

  1. take a ls of files, output the commands to format/copy the files to have the correct naming format.
  2. Resize copies of the files to create thumbnails. (not even dealing with that step yet)

Failure

My code fails at the regex step, because although I just want to filter out everything except a single regex group, when I get the results, it's always returning the group that I want -and- the group before it, even though I in no way requested the first backtrace group.

Here is a fully functioning, runnable version of the code on the online ide: http://ideone.com/2RiqN

And here is the code (with a cut down initial dataset, although I don't expect that to matter at all):

<?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.
}
?>

Intended result for the regex: 788750 Intended result for the code output (multiple lines of): cp air-something-something-C485850_A.jpg ./ch/ch-485850.jpg;

What's wrong with my regex? Suggestions for simpler matching code would be appreciated as well.


Just a guess:

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

This includes the whole filename in the match. Otherwise preg_replace() will really only substitute the end of each string - it only applies the $replacement expression on the part that was actually matched.


Scan Dir and Expode

You know what? A simpler way to do it in php is to use scandir and explode combo

  $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 :)

explode: basically a filename like blah-2.jpg is turned into a an array('blah','2.jpg); and then taking the end() of that gets the last element. It's the same almost as array_pop();

Working Example

Here's my ideaone code http://ideone.com/gLSxA

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜