将名称与下划线后面的数字匹配

时间:2017-09-20 11:08:28

标签: php regex preg-match preg-replace-callback

我有一个像'Doc 16_1.pdf'这样的文件名,我必须检查该名称是否与preg_match一致,如果匹配则下一个号码将是'Doc 16_2.pdf'

'/(?:(?: \(_[\d]+\))?(\.[^.]+))?$/'

$ name ='Doc 16';

我正在检查

    return preg_replace_callback(
        /(?:(?: \(_[\d]+\))?(\.[^.]+))?$/,
        array($this, 'upcount_name_callback'),
        $name,
        1
    );

一样增量
protected function upcount_name_callback($matches) {
    print_r($matches);
    $index = isset($matches[1]) ? ((int)$matches[1]) + 1 : 1;        
    $ext = isset($matches[2]) ? $matches[2] : '';        
    $nm = '_'.$index.$ext;        
    return $nm;
}

我已经尝试过上面的preg_match,但它没有返回匹配的结果。

你能帮帮我吗,先谢谢你。

2 个答案:

答案 0 :(得分:0)

以此为出发点。

<?php
if (preg_match("/^(.*)_(\d*)\.pdf$/", $filename, $output)) {
    $docname = $output[1];
    $num = (int)$output[2];
}
?>

e.g。 http://www.phpliveregex.com/p/lns

答案 1 :(得分:0)

您可以使用

增加数字
preg_replace_callback('/_(\d+)(\.[^.]+)?$/', function($m) {
    return "_" . ($m[1]+1) . $m[2];
},$name);

<强>详情

  • _ - 下划线
  • (\d+) - 第1组($m[1]):一个或多个数字
  • (\.[^.]+)? - 可选组2($m[2]):一个点和除.以外的一个或多个字符
  • $ - 字符串结束。

请参阅PHP demo

$name = 'Doc 16_1.pdf';
echo preg_replace_callback('/_(\d+)(\.[^.]+)?$/', function($m) {
    return "_" . ($m[1]+1) . $m[2];
},$name);