preg_match确切的数字

时间:2011-07-11 16:02:10

标签: php regex preg-match

我正在使用

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

在ID列表中找到数字10($ ids)。但是,如果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;
    }
}

感谢所有人的帮助。

4 个答案:

答案 0 :(得分:2)

不要使用正则表达式。使用in_array()

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

答案 1 :(得分:1)

在正则表达式中,如果要查找完全匹配而不仅仅是子字符串匹配,则需要使用开始和结束锚点。它们由^(开头)和$(结束)字符在正则表达式中表示。

所以你的正则表达式找到“10”而不是“110”等,将是/^10$/

但如果您正在寻找一个号码,为什么不使用==in_array()

PHP非常能够评估数字,而无需使用正则表达式对其进行解析。

答案 2 :(得分:1)

$regex = '/^10$/';

只有当^是字符串的开头且$是字符串的结尾时才会匹配。

答案 3 :(得分:0)

我会根据@Cfreak的建议使用in_array(),但如果您想使用正则表达式匹配10的ID,则可以

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

如果您有array(1,10,1010,010),则implode()会将此更改为1|10|1010|010,并且该模式将与“10”匹配,而不是任何其他数字之前或之后(即另一个数字) 01,如0101

相关问题