正则表达式用于提取数字和字符串的扩展

时间:2016-09-23 18:19:29

标签: php regex

我使用下面的代码来提取带有问题标准化的字符串的数字和文件名

30183308__90_.jpeg
30193253-(100).jpg
30193253__100__.jpg 
30193253_ _100_ _.jpg 

使用此功能

public function refactorFileName($filename)
{
    $array = preg_split("/[^A-Za-z0-9]/", $filename);
    foreach($array as $key => $value) {
        if($value == "") {
            unset($array[$key]);
        }
    }
    $array              = array_values($array);
    $standardFilename   = $array[0].'.'.$array[2];
    $indexFile          = $array[1];

    return compact("indexFile","standardFilename");
}

$filename = '30193253_ _100_ _.jpg';
extract(refactorFileName($filename));
echo "New File name -> ".$standardFilename.PHP_EOL;
echo "Index for file -> ".$indexFile.PHP_EOL;

这个节目(正确):

New File name -> 30193253.jpg
Index for file -> 100

我认为有更好的正则表达式代码。

编辑: 对于这个问题,它在preg_split或更好的代码上可能有更好的代码吗?

1 个答案:

答案 0 :(得分:1)

两件事:1)如果你在你的模式中放置一个量词会更容易(以避免无用的foreach之后)。 (请注意,preg_split还有选项PREG_SPLIT_NO_EMPTY以避免空项目。)
2)有时过多的冗长会导致冗长。

你可以这样重写:

function refactorFileName($filename) {
    $p = preg_split('~[\W_]+~', $filename, 3);

    return [ 'indexFile' => $p[1], 'standardFilename' => "$p[0].$p[2]" ];
}

或者如果你想更加冗长:

function refactorFileName($filename) {
    list($name, $index, $ext) = preg_split('~[\W_]+~', $filename, 3);

    return [ 'indexFile' => $index, 'standardFilename' => "$name.$ext" ];
}

(顺便说一句,当你已经有了一个正常工作的代码时,请在codereview而不是SO上提出你的问题)