2010-12-13 11 views
5

Potrzebuję trochę porady, jak to zrobić. Mam tablicę PHP z ciągami. Struny mają reprezentować kody PIN, które mają 6 cyfr jak:Tablica filtrów PHP

560095 

Posiadanie miejsca po 3 cyfr jest również uważane za ważne jak 560 095

Wszystkie elementy tablicy są nieprawidłowe. Chcę pomóc w tym filtrowaniu, aby uzyskać nową tablicę wszystkich ważnych kodów PIN.

Szukałem i wygląda na to, że muszę użyć wyrażenia regularnego. Czy to jest poprawne?

Odpowiedz

17

Tak, możesz użyć do tego celu wyrażenia regularnego.

PHP ma funkcję o nazwie preg_grep, do której przekazywane jest wyrażenie regularne, i zwraca nową tablicę z wpisami z tablicy , które pasują do wzorca.

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

Wyjaśnienie regex:

^  - 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

Tak, można użyć wyrażenia regularnego, aby upewnić się, że istnieje 6 cyfr z lub bez przestrzeni.

Schludny narzędzie do odtwarzania z wyrażeń regularnych jest RegExr ... oto co RegEx wymyśliłem:

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

To dopasowuje początek napisu ^, to jakieś trzy numery [0-9]{3} następuje opcjonalny space \s?, po którym następują kolejne trzy liczby [0-9]{3}, a następnie koniec ciągu znaków $.

Przekazanie tablicy do funkcji PHP preg_grep wraz z Regeksem zwróci nową tablicę z tylko pasującymi indecjami.

0

Jeśli chcesz po prostu iteracyjne nad poprawnych odpowiedzi (pętla nad nimi), zawsze można użyć RegexIterator:

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

Ma korzyści nie kopiując całą tablicę (to oblicza następny kiedy chcesz). Jest więc o wiele bardziej efektywny w pamięci niż robienie czegoś z preg_grep dla dużych tablic. Ale będzie również wolniejszy, jeśli wielokrotnie przeprowadzasz iterację (ale w przypadku pojedynczej iteracji powinien być on szybszy z powodu użycia pamięci).

0

Aby uzyskać tablicę ważnych kodów PIN, należy użyć codaddict's answer.

Można też, w tym samym czasie co filtrowanie tylko poprawnych kodów PIN, wyjąć opcjonalny znak spacji, tak aby wszystkie styki stają się 6 cyfr za pomocą preg_filter:

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

Najlepszą odpowiedź może zależeć od sytuacji, ale jeśli chcesz zrobić prosty i niski koszt, najpierw ...

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

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

Następnie można równie dobrze przejść do sprawdzania typu - o ile prawidłowe liczby nie zaczynają się od 0, w którym to przypadku może być trudniej.

Jeśli nie zawiodłeś wcześniej, przejdź do już opublikowanych rozwiązań regex.