我使用下面的代码来提取带有问题标准化的字符串的数字和文件名
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或更好的代码上可能有更好的代码吗?
答案 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上提出你的问题)