2012-08-01 24 views
2

我有一個字符串,類似於我試圖解析的tvm11551.iso。在這個字符串中,這些粗體數字有所不同:tvm .iso(請忽略此處的空格)。我寫在PHP下面的程序會從該字符串中提取這兩個數字:需要正則表達式從一個字符串中提取兩個子字符串

$a = "tvm11551.iso"; 

if(preg_match('/^tvm\d{5}\.iso/',$a)){ 
    $b = preg_match('/tvm(\d\d)\d\d\d\.iso/' , $a); 
    $c = preg_match('/tvm\d\d\d(\d\d)\.iso/' , $a); 
    echo "B: " . $b . "<br>"; 
    echo "C: " . $c; 
} 

但是,我得到的輸出爲:

B: 1 
C: 1 

如何解決的正則表達式來獲得預期輸出?

+0

它是_always_兩個數字在'5'的兩邊,總共是5位數? – 2012-08-01 20:50:08

+0

@邁克爾:是的,確切! – 2012-08-01 20:57:32

回答

5

1你看到爲輸出的匹配,而不是他們的內容的數量,即在成功匹配preg_match()回報。由於每個測試只有一個()捕獲組,因此返回了一個匹配項。需要捕獲匹配到一個數組作爲第三個參數,以preg_match()

$a = "tvm11551.iso"; 
$matches = array(); 
preg_match('/^tvm(\d{2})5(\d{2})\.iso$/', $a, $matches); 

var_dump($matches); 
array(3) { 
    [0] => 
    string(12) "tvm11551.iso" 
    [1] => 
    string(2) "11" 
    [2] => 
    string(2) "51" 
} 
+0

對實際問題(+1)的更好回答,但是當一個簡單的子字符串可以完成這項工作時,在這裏使用RegEx仍然毫無意義。 – KRyan 2012-08-01 20:53:03

+0

@邁克爾:謝謝!那很簡單!後來我意識到我問了一個很愚蠢的問題,哈哈。 – 2012-08-01 21:05:24

+0

*很簡單! – 2012-08-02 00:02:21

3

根據您的模式,我沒有看到任何理由在初次匹配後使用RegEx。

你只想要這個:

if(preg_match('/^tvm\d{5}\.iso/',$a)){ 
    $b = substr($a, 3, 5); 
    $c = substr($a, 6, 8); 
+3

主要的開銷是加載正則表達式引擎,所以如果你已經這樣做來匹配文件名,那麼在這個時候可能不會在正則表達式中捕獲正則表達式。我有興趣看看基準知道是否在已經初始化正則表達式後切換到兩個'substr()'函數調用的速度更快...... – 2012-08-01 20:55:13

+1

有趣的,不知道有關開銷。我也會對基準測試感興趣。 – KRyan 2012-08-01 20:58:31

1

的preg_match返回的次數的模式匹配(數量,但由於的preg_match總是停止在它發現,它總是返回第一匹配0或1 )。如果你想得到匹配的數字,你必須傳遞一個數組作爲preg_match的第三個參數。請參閱preg_match documentation

相關問題