preg_match在1之后取代数字2而不是10

时间:2013-06-11 06:05:55

标签: php preg-match

我在文件夹中有一些文件如下: ss1.txt, ss2.txt, .., ss9.txt, ss10.txt, ss11.txt, .., ss19.txt, ss20.txt

当我尝试使用preg_match获取这些文件时,我按顺序得到了结果:

ss1.txt, ss10.txt, ss11.txt, ... ss19.txt, ss2.txt, ss20.txt

我需要的完全如下:

ss1.txt, ss2.txt, .., ss9.txt, ss10.txt, ss11.txt, .., ss19.txt, ss20.txt

我使用的表达方式如下:

    '/_ss[1-9]+\.txt/' 

2 个答案:

答案 0 :(得分:0)

首先建立前0-9场比赛的列表:

<?php
$files = array("ss1.txt", "ss2.txt", "ss14.txt");
$sorted = array();
$a_string = "";
foreach ($files as &$file) {
    preg_match ('/_ss[1-9]\.txt/', file, matches)
    $a_string = $matches[0];
    if (isset($a_string)) {
       array_push($sorted, $a_string); } }
unset($file); 

然后建立第二个11-20场比赛名单:

foreach ($files as &$file) {
    preg_match ('/_ss[0-9][0-9]\.txt/', file, matches)
    $a_string = $matches[0];
    if (isset($a_string)) {
       array_push($sorted, $a_string); } }
unset($file); 
?>

另一种方法可能是使用preg_match_all返回两个匹配列表而不进行循环,但前提是您的数据已经在一个大字符串中(或者您想要转换它)。

$giant_text = join (" ", $files)
$list_of_single_dig = preg_match_all('/_ss\d\.txt/', $giant_text, $matches);
$list_of_double_dig = preg_match_all('/_ss\d\d\.txt/', $giant_text, $matches);
$sorted = array_merge ($list_of_single_dig, $list_of_double_dig)

答案 1 :(得分:0)

查看natsort

$sorted = natsort($unsorted_files);