2012-03-11 12 views
5

Próbuję nauczyć się korzystać z preg_match. Chcę, aby użytkownicy mogli rejestrować się przy użyciu nazwy użytkownika zawierającej od 2 do 20 znaków, która może zawierać a-zA-Z0-9.Regex, aby dopasować 2-20 znaków alfanumerycznych, umożliwiając pojedynczy łącznik w dowolnym miejscu ciągu.

Teraz najtrudniejsza część, gdzie gubię Im, chcę, żeby móc to jeden łącznik w dowolnym miejscu na nazwę użytkownika tak,

 
-Brad = TRUE 

--Brad = FALSE 

B-Rad = TRUE 

Odpowiedz

5

Można to budować krok po kroku. Chcesz nazwę użytkownika, które składają się z 2-20 znaków szczególnych:

^[a-zA-Z0-9]{2,20}$ 

Teraz chcesz zezwolić pojedynczy - charakter gdzieś tam (część podstęp):

- znak jest dozwolone tylko wtedy, gdy nie następuje przez inny - do końca łańcucha:

[-](?=[^-]*$) 

jest to tzw uprzedzona twierdzenie. W połączeniu z przemian, regex kończy się:

^(?:[a-zA-Z0-9]|[-](?=[^-]*$)){2,20}$ 

porównaniu do innych udzielonych odpowiedzi, ten szanuje swoją specyfikację długości.

+0

WOW! - Dziękuję za tę odpowiedź. Wyjaśniłeś to również dobrze, właśnie miałem się poddać próbując i zgadzając się na użycie dwóch informacji z preg_match. –

+0

@BradleyRoberts: Nie ma za co. Napisałeś, że chcesz się nauczyć * i * wzorzec w twoim pytaniu nie był tak oczywisty, więc było coś, co mógłbyś majstrować;) Życzę powodzenia w postępach w nauce, trochę czasu zajmuje myślenie w tym języku, ale to naprawdę potężne. Możesz także spróbować poprawić, próbując odpowiedzieć na pytania regex, które pojawiają się tutaj, z powodu innych odpowiedzi często jest coś do nauczenia się. – hakre

3

można użyć preg_match z:

\w*-?\w* 

To upewni się, że istnieje jeden łącznik, ale dopasuje tylko myślnik. Możesz również użyć:

(\w*-?\w+)|(\w+-?\w*) 

Aby uniknąć dopasowywania tylko łącznika. Lub możesz sprawdzić, czy mecz ma długość> 1.

Powiedziałeś, że umiesz, więc założyłem, że łącznik nie jest wymagany. Jeśli tak, usuń? w wyrażeniu regularnym.

Jeśli planujesz dopasować zdanie, możesz użyć podziału na słowa (\ b) z częścią \ w +. Jeśli używasz tego na przyciętym łańcuchu, dodaj^i $ odpowiednio na początku i na końcu, aby uniknąć dopasowania do wartości --Bra-d jako prawdziwej.

+0

chcę użytkownikom wolno tylko jeden łącznik. Nie muszą mieć łącznika. Chcę je ograniczyć do 2 - 20 długości nazwy użytkownika, ale inne znaki, które będą dołączone, mogą być a-zA-Z0-9. –

+0

Ok, a następnie wprowadzenie? najlepiej –

+0

czy te wzory odrzucają wiele łączników? – dldnh

2
^[a-zA-Z0-9]*\-?[a-zA-Z0-9]*$ 

jest regex

Zmieniano: Szybkie rozwiązanie dla długości: użyć drugiego preg_match z ^.{2,20}$

+0

Tak, to działa, ale jak mogę ograniczyć to do 2-20 znaków razem? –

+0

Dziękuję za twoją edycję, będę miał zabawę i zrobię funkcję php, zachowaj mnie, pisz dalej w miejscach :) –

+2

@Bradley Roberts Anytime. Myślę, że byłoby lepiej chociaż użyć 'strlen' do sprawdzania długości – dotoree

2

Oto jak ja to zrobię:

if (preg_match(
    '/# Match pwd of alpha-numbers allowing one optional dash. 
    ^    # Anchor to start of string. 
    (?=.{2,20}\z)  # Assert length is from 2 to 20 chars. 
    [a-zA-Z0-9]*  # Zero or more alpha-num before dash. 
    (-[a-zA-Z0-9]*)? # Optional dash and more alpha-num. 
    \z    # Anchor to end of string. 
    /x', $text)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 
Powiązane problemy