2011-07-11 28 views
2

我使用的preg_match確切的數字

$regex = '/'.implode('|', 10).'/i';  
preg_match($regex, $ids) 

找到的ID($ IDS)的列表中的號碼10。但是,如果ID列表如下:

$ids = array(10, 110, 1010); 

難道帶回所有的人?我怎樣才能找到確切的數字我後,並不只是找到一個數字包含我以後的數字?

謝謝。

編輯:

我上面犯了一個錯誤。 ID列表實際上是一串以逗號分隔的值。例如:

$ids = "10,1010,101"; 

這很難解釋這背後的整個想法的過程,但是這是我的全部代碼:

<?php 
$file = fopen('allprods.csv', 'r'); 


$id = array($_GET['id']);  
$id = array_map('preg_quote', $id); 
$regex = '/'.implode('|', $id).'/i'; 

$skus = array(); 
while (($line = fgetcsv($file)) !== FALSE) { 
    list($ids, $sku) = $line; 

    if(preg_match($regex, $ids)) { 
    $skus[] = $sku; 
    } 
} 

$count = count($skus); 
$i = 1; 

echo $category_id; 
foreach ($skus as $sku){ 
     echo $sku; 
     if($i != $count) { echo "`"; } 
     $i++; 
} 

,我主要是通過具有一個ID列一個CSV生根(一些行在該列中具有多個ID,由逗號分隔)和sku列。更多信息here

所以我需要代碼來檢查特定ID的id字符串,例如10,然後將相應的SKU添加到sku數組中。

我敢肯定這段代碼是一團糟,所以忍着我,而我劈開PHP的位!

編輯:現已解決!正如答案中所提到的,我使用了in_array。首先我爆炸逗號分開的字符串。代碼可以看到下面:

$skus = array(); 
while (($line = fgetcsv($file)) !== FALSE) { 
    list($ids, $sku) = $line; 

    $cats = explode(',',$ids); 

    if (in_array($_GET['id'], $cats)) { 
     $skus[] = $sku; 
    } 
} 

感謝您的幫助所有。

+1

你爲什麼不使用in_array(「10」,陣列(..... ),是)? –

+0

對不起,我已經意識到我的問題並沒有超出上下文的意義。你的答案可能會導致我找到解決方案。我將很快發佈一個響應 –

+0

您可能需要考慮使用mysql或類似的數據庫。更快/更容易。 – dqhendricks

回答

2

不要爲此使用正則表達式。使用in_array()

if(in_array(10, $ids)) { 
    // do something 
} 
else { 
    // not found 
} 
+0

乾杯,解決方案張貼上面 –

1

在正則表達式,如果你想找到完全匹配的,而不僅僅是一個字符串匹配,你需要使用的開始和結束錨。這些在正則表達式中由^(開始)和$(結束)字符表示。

所以你的正則表達式找到「10」而不是「110」等,將是/^10$/

但是,如果您正在尋找一個號碼,爲什麼不使用==in_array()

PHP是相當能夠評估一個數字,而不必用正則表達式解析它。

1
$regex = '/^10$/'; 

如果^是字符串的開頭,而$是字符串的結尾這樣只會匹配。

+0

我意識到這個答案是正確的,我問了,但是,我更新了我的問題,更多的信息 - 因爲這將在我的情況下工作。謝謝! –

0

我會使用in_array()通過@Cfreak的建議,但如果你想使用正則表達式匹配的10一個id,你可以做

preg_match('/[^\d]?10[^\d]?/', implode('|', $ids)) 

如果你有array(1,10,1010,010)implode()將這個改變1|10|1010|010和該模式將對陣「10」不是之前或之後任何其他數字(即另一010101