2010-01-16 44 views

回答

3

如果文件名稱都以數字開頭就沒有必要使用正則表達式,試試這個:

foreach (glob('/path/to/dir/{0,1,2,3,4,5,6,7,8,9}*', GLOB_BRACE) as $file) 
{ 
    echo $file . ' = ' . intval(basename($file)) . "<br />\n"; 
} 

更新glob模式將只匹配以數字啓動文件名,爲你請求。


@ ghostdog74:你說得對。

foreach (glob('/path/to/dir/{0,1,2,3,4,5,6,7,8,9}*', GLOB_BRACE) as $file) 
{ 
    echo $file . ' = ' . filter_var(basename($file), FILTER_SANITIZE_NUMBER_INT) . "<br />\n"; 
} 
+0

注意:intval會將「045_image.jpg」中的「045」變成45. – ghostdog74 2010-01-18 00:39:57

+0

@ ghostdog74:我錯過了那個,現在修復了。 – 2010-01-18 01:24:13

2

該期間的第一個explode,然後展開下劃線,然後你的號碼是返回列表中的第一個元素。

<?php 
$str1 = "1234.jpg"; 
$str2 = "1234_crob.jpg"; 

$pieces = explode("_",current(explode(".",$str1))); 
echo $pieces[0]; // prints 1234 

$pieces = explode("_",current(explode(".",$str2))); 
echo $pieces[0]; // prints 1234 
?> 

是的,我知道這是不是正則表達式,但是這是太簡單了,使用正則表達式的任務。

編輯:修改後的代碼爲您新編輯的格式化示例工作。編輯:修改爲適合在一行代碼乾淨。

+0

奧赫...正則表達式會更簡單! =)另外,一些文件名可能根本沒有數字(至少這是提問者對我的回答所作的評論)。 – 2010-01-16 20:35:25

+0

@Alix Axel:呵呵,也許這是真的。如果可能的話,我總是喜歡使用內置函數。我猜可以使用is_numeric()來測試$ pieces [0]是否是一個數字。但是我明白你在說什麼,現在這個代碼看起來好像比正則表達式更復雜。 – Roman 2010-01-16 20:43:01

2

假設你只有通過在文件名(而不是文件路徑),下面應該檢索所有連續編號0-9:

function getDigits($fn) { 
    $arr = array(); 
    preg_match('/[0-9]+/', $fn, $arr); 
    return $arr; 
} 

用法示例

var_dump(getDigits('hey_12345.gif')); 
/* 
output: 
array(1) { 
    [0]=> 
    string(5) "12345" 
} 
*/ 

var_dump(getDigits('123487_dude.jpg')); 
/* 
output: 
array(1) { 
    [0]=> 
    string(6) "123487" 
} 
*/ 
0

試試這個。如果你有像045_test.jpg數字,使用intval會給你45而不是045

$path="/path/[0-9]*"; 
foreach (glob($path) as $files){ 
    $base=basename ($files); 
    $s = preg_split("/[^0-9]/",$base,2); 
    echo $s[0]."\n"; 
}