2009-08-03 7 views
10

Szukam wyrażeń regularnych, które sprawdziłyby, czy ciąg składa się tylko z liter az, cyfr, podkreślenie (_) i łącznik (-). Próbowałem tego, ale to nie działa:Potrzebujesz wyrażenia regularnego, które sprawdzi, czy ciąg znaków składa się tylko z liter ai cyfr i podkreśleń (_) i łącznika (-)

if (!preg_match('/^a-zA-Z0-9_-$/', $string)) { 
    $reg_Error[] = 2; 
} 

Czy mogę sprawdzić długość z wyrażeniem regularnym? Jeśli nie, zrobię to za pomocą PHP.

+2

Sprawdź długość za pomocą strlen. Regex to narzędzie, a nie młotek. :) – OIS

Odpowiedz

1

regex należy: '^ [\ w \ D -] + $'

+1

Aby wyjaśnić, że: "-" jest znakiem specjalnym w nawiasach kwadratowych *, chyba że * jest to pierwszy lub ostatni znak w nawiasach. –

+0

'a-zA-Z_' może być zamienione na' \ w', '0-9' może być zastąpione przez' \ d' – RaYell

+1

'a-zA-Z0-9_' może być zamienione tylko na' \ w'. –

3

najkrótsza:

/^ [\ w -] + $/

+1

Jeszcze krócej: '/^[\ w -] + $ /' – RaYell

+0

A gdzie jest podkreślenie ?? – seize

+1

Podkreślenie jest częścią '\ w'. –

14

Musisz umieścić swój regex /^a-zA-Z0-9_-$/ w klasie znaków /[...]/.
Oznacza to, że można dopasować dowolny znak w klasie postaci. Powinieneś również podać kwantyfikator, ponieważ /^[a-zA-Z0-9_-]$/ będzie pasował tylko do jednego znaku.

Przykłady:
/^[a-zA-Z0-9_-]+$/ ze znakiem + dopasować go jednym lub więcej czasu
/^[a-zA-Z0-9_-]{1,}$/ taki sam jak powyżej
/^[a-zA-Z0-9_-]{10,20}$/ między 10 a 20 znaków długości.
/^[a-zA-Z0-9_-]{15}$/ To musi być dokładnie 15 znaków. Możesz go użyć do sprawdzenia długości ciągu znaków.

Można również użyć następujące słowa kluczowego, aby Państwa regex czytelny:
/^[\w-]+$/ który pasuje do charakteru słowo (w tym podkreślenia, liter i cyfr) lub myślnik, jedno lub więcej czasu.

1

Odpowiedzi dotychczas prawidłowo wyjaśnić klasę postaci/^[A-Za-z0-9_-]+$/

Można sprawdzić długość. + oznacza "jeden lub więcej z poprzednich", * oznacza zero lub więcej z poprzedzających "i {2,4} oznacza" pomiędzy 2 a 4 z poprzedzających ".

Nie można określić długości ma do be a prime, chociaż określenie, że długość musi być równa, jest możliwe, ale nie jest to proste:/^(xx){1,3}$/pasuje xx, xxxx lub xxxxxx. Liczba tutaj odnosi się do liczby , a nie do liczby x'es

6

Chciałbym skorzystać z tego jeden:

/^[a-z_\-\d]+$/i 

na pytanie dlaczego nie używam \w, następujące qu Uwaga, zaczerpnięte z PHP PCRE Pattern Reference, należy wyjaśnić, dlaczego nie należy używać \w w tej sytuacji:

A „Słowo” każdy znak jest litera lub cyfra lub znak podkreślenia, że ​​jest dowolny znak, który może być częścią "słowa" Perla. Definicja liter i cyfr jest kontrolowana przez tabele znaków PCRE i może się różnić, jeśli ma miejsce dopasowanie do ustawień regionalnych. Na przykład w ustawieniach regionalnych "fr" (francuski), niektóre kody znaków większe niż 128 są używane dla liter akcentowanych i są one dopasowane przez \w.

To zachowanie nie jest pożądane w tym przypadku, więc jeśli nie chcesz się martwić o lokalizacji, użyj zamiast prostych klas postaci z \w stenografii.

Jeśli chcesz określić minimalną długość (na przykład 3):

/^[a-z_\-\d]{3,}$/i 

Jeśli chcesz określić zarówno minimalną i maksymalną długość (na przykład 2 i 5):

/^[a-z_\-\d]{2,5}$/i 
Powiązane problemy