2010-12-13 18 views
5

Bunun nasıl yapılacağı konusunda biraz tavsiyeye ihtiyacım var. PHP dizi dizim var.PHP filtre dizisi

560095 

Tüm dizi öğelerini geçerli olmayan 3 basamaklı sonra da 560 095

olarak geçerli kabul edilir bir boşluk olması: dizeleri gibi 6 basamak olan PIN kodlarını temsil etmek gerekiyor. Tüm geçerli PIN kodlarının yeni bir dizisini almak için bu filtrelemeyi yapmak için yardım istiyorum.

Aradım ve düzenli ifade kullanmam gerekebilir gibi görünüyor. Bu doğru mu?

cevap

17

Evet, bunun için düzenli ifadelerden yararlanabilirsiniz.

PHP, düzenli ifadenizi geçirdiğiniz preg_grep adlı bir işleve sahiptir ve deseni eşleştiren giriş dizisinden girişlerle yeni bir dizi döndürür. regex ait

$new_array = preg_grep('/^\d{3} ?\d{3}$/',$array); 

Açıklama:

^  - Start anchor 
\d{3} - 3 digits. Same as [0-9][0-9][0-9] 
? - optional space (there is a space before ?) 
     If you want to allow any number of any whitespace between the groups 
     you can use \s* instead 
\d{3} - 3 digits 
$  - End anchor 
2

Evet, 6 basamak veya boşluksuz olmadığından emin olmak için normal bir ifade kullanabilirsiniz.

^[0-9]{3}\s?[0-9]{3}$ 

Bu isteğe bağlı bir takip dize ^, o zaman herhangi üç sayı [0-9]{3} başıyla eşleşir:

düzenli ifadeler ile oynamak için bir temiz alet RegExr olduğunu ... Burada RegEx ben ile geldi ne \s? numaralı alana başka bir üç sayı [0-9]{3} ve onu takiben $ dizesinin sonuna kadar devam eder.

Diziyi, PHP işlevine preg_grep Router ile birlikte iletmek, yalnızca eşleşen indekslerle yeni bir dizi döndürecektir.

0

sadece geçerli yanıtları (üzerlerinden döngü) üzerinden yineleme yapmak istiyorsanız, her zaman kullanabileceği bir RegexIterator:

Bu dizinin tamamı kopyalama değil yararı vardır
$regex = '/^\d{3}\s?\d{3}$/'; 
$it = new RegexIterator(new ArrayIterator($array), $regex); 
foreach ($it as $valid) { 
    //Only matching items will be looped over, non-matching will be skipped 
} 

(o sonrakini hesaplar ne zaman istersen). Yani büyük diziler için preg_grep ile bir şey yapmaktan çok daha fazla bellek verimli. Ancak, birden çok kez yinelerseniz de daha yavaş olacaktır (ancak tek bir yinelemede bellek kullanımı nedeniyle daha hızlı olmalıdır).

0

Geçerli PIN kodlarının bir dizisini almak isterseniz, codaddict's answer'u kullanın. Tüm PIN'ler 6 basamak haline böylece

Ayrıca, tek geçerli PIN filtreleme ile aynı zamanda, preg_filter kullanarak isteğe bağlı boşluk karakteri kaldırın olabilir:

$new_array = preg_filter('/^(\d{3}) ?(\d{3})$/D', '$1$2', $array); 
0

en iyi yanıtı durumunuza bağlı olabilir, ama önce basit ve düşük maliyetli bir kontrol yapmak istiyorsan ...

$item = str_replace(" ", "", $var); 

if (strlen($item) !== 6){ 
echo 'fail early'; 
} 

Bundan sonra ise sen eşit gidip bazı tür denetlemesi yapabileceğini - müddetçe geçerli numaralar durumda daha zor olabilir ki 0 ile başlamadı.

Erken başarısız olmazsanız, daha önce gönderdiği normal ifadelerle devam edin.