точное число preg_match - PullRequest
2 голосов
/ 11 июля 2011

Я использую

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

, чтобы найти число 10 в списке идентификаторов ($ ids). Однако, если список идентификаторов выглядит так:

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

Вернет ли это их всех? Как я могу найти точное число, за которым я иду, а не просто найти число, которое содержит число, за которым я иду?

Спасибо.

Edit:

Я ошибся выше. Список идентификаторов на самом деле представляет собой строку значений, разделенных запятыми. Например:

$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++;
}

По сути, я рутирую через CSV, в котором есть столбец идентификаторов (в некоторых строках есть несколько идентификаторов в этом столбце, разделенных запятыми) и столбец sku. Подробнее здесь

Поэтому мне нужен код, чтобы проверить строку идентификаторов для определенного идентификатора, например, 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 ]

2 голосов
/ 11 июля 2011

Не используйте для этого регулярное выражение. Используйте in_array()

if( in_array(10, $ids) ) {
     // do something
}
else {
     // not found
}
1 голос
/ 11 июля 2011
$regex = '/^10$/';

это будет соответствовать, только если ^ - начало строки, а $ - конец строки.

1 голос
/ 11 июля 2011

В регулярном выражении, если вы хотите найти точное совпадение, а не просто совпадение подстроки, вам нужно использовать начальный и конечный якоря.Они представлены в регулярном выражении символами ^ (начало) и $ (конец).

Таким образом, ваше регулярное выражение для поиска "10", а не "110" и т. Д. Будет /^10$/.

Но если вы ищете число, почему бы просто не использовать == или in_array()?

PHP вполне способен вычислять числа, не анализируя их с помощью регулярных выражений.

0 голосов
/ 11 июля 2011

Я бы использовал in_array(), как предложено @Cfreak, но если вы хотите использовать регулярное выражение для совпадения с идентификатором 10, вы можете сделать

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

Если у вас есть array(1,10,1010,010),implode() изменит это на 1|10|1010|010, и шаблон будет совпадать с '10', которому не предшествует или не следует любая другая цифра (т.е. другая 0 или 1, как в 0101)

...