2011-01-27 13 views
5

Potrzebuję wyrażenie regularne do sprawdzania ciąg. Łańcuch może być pusty, może zawierać 5 cyfr i może mieć 9 cyfr. Inne sytuacje są nieważne. Używam następnego wyrażenia:Długość cyfr regex PHP tylko 5 lub 9

/\d{5}|\d{9}/ 

Ale to nie działa.

+2

'/^(\ d {5}) (\ d {4})?) $ /'? Zakładając, że cyfry są jedyną rzeczą w łańcuchu, pasuje to do 5 cyfr, opcjonalnie po 4 kolejne. –

+0

@MarcB: To nie jest nawet poprawne składniowo. –

+0

Cuirious, co powiedziałby ci pusty ciąg? – sln

Odpowiedz

16

Podobnie jak Marc B said in the comments, chciałbym użyć tego wyrażenia regularnego:

/^(\d{5}(\d{4})?)?$/ 

Dopasowuje albo dokładnie pięć cyfr, które mogą być stosowane przez kolejne cztery cyfry (zatem dziewięciu cyfr w sumie) lub bez znaków na wszystkich (zwróć uwagę na kwantyfikator ? wokół wyrażenia cyfr, który sprawia, że ​​grupa jest opcjonalna).

Zaletą tego wzoru w przeciwieństwie do innych wymienionych wzorów z naprzemiennymi zmianami jest to, że nie będzie to wymagało cofnięcia, jeśli dopasowanie pięciu cyfr zakończy się niepowodzeniem.

1

"nie działa" to niewiele pomoże. ale czy nie byłoby to coś takiego?

/^(\d{5}|\d{9}|)$/ 

(Bit zardzewiały na regexp, ale staram się zrobić to „start, następnie 5 lub 9 cyfr albo nic, a następnie zakończyć)

3
~^(?:\d{5}|\d{9}|)$~ 

Zapomniałaś kotwice ^ i $ . Bez nich łańcuch będzie pasować te cyfry w dowolnym miejscu w ciągu, nie tylko na początku lub na końcu. Ponadto, że nie pokrywa pusty ciąg znaków.

4

zastosowania kotwic i „?”, aby umożliwić pusty ciąg

/^(\d{5}|\d{9})?$/ 
1

Odpowiedź na pytanie, dlaczego praca jest wykonywana w reperkusjach w stylu Perla, jest priorytetowana od lewej do prawej.

go zmienić na:

/\d{9}|\d{5}/ (Choć to nie powiem ci coś jeszcze o 6-8 i 10-nieskończoność chyba że zakotwiczone twierdzeń lub coś innego).

/^(\d{5}|\d{9}|)$/