2011-07-11 29 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