2016-02-27 13 views
7

Zrobiłem trochę badań, ale nie znalazłem niczego, co by dokładnie pasowało do tego, czego potrzebuję i kiedy próbowałem stworzyć wyrażenie, zawsze jest trochę poza tym, czego potrzebuję.Wyrażenia regularne, zezwalaj tylko na określony format. "John-doe"

Podjęłam próbę stworzenia czegoś podobnego do linii [AZaz09]{3,8}\-[AZaz09]{3,8}.

Chcę, aby prawidłowy wynik był dozwolony tylko w tekście tekstowym, gdzie albo albo tekst może być alfabetyczny lub numeryczny, jednak jedynym dozwolonym symbolem jest - i znajduje się pomiędzy dwoma tekstami.

Każdy tekst musi składać się z co najmniej trzech znaków ({3,8}?), A następnie oddzielonych znakiem -.

Dlatego, aby była ona ważna niektóre przykłady mogą być:

Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 

Nieprawidłowe testy mogą być:

Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b% 
+1

Czy chcesz również dopasować litery akcentowane lub inne alfabety? Podobnie jak "déjà-vus", "12μ-13μ", "mañana-1234" – trincot

+0

@trincot: Dobrze, zaktualizowałem moją odpowiedź, aby odzwierciedlić modyfikator 'u'. – Jan

Odpowiedz

10

Trzeba użyć kotwic i użyj - więc znaki w klasie znaków są odczytywane jako zakres, a nie poszczególne znaki.

Spróbuj:

^[A-Za-z0-9]{3,8}-[A-Za-z0-9]{3,8}$ 

Demo: https://regex101.com/r/xH3oM8/1

też mógłby uprościć on jednak z i modyfikatora i meta charakter \d.

(?i)^[a-z\d]{3,8}-[a-z\d]{3,8}$ 
+0

Pierwsza wydaje się być idealna do mojego użytku :) – mhvvzmak1

+0

Zauważyłem, że na stronie znajduje się/gm pod koniec wyrażenia regularnego, co robi ten gm i czy jest on wymagany? – mhvvzmak1

+2

'g' jest globalnym modyfikatorem,' m' jest wielolinijkowym. To tylko po to, aby to zademonstrować. 'G' nie jest obsługiwany w PHP. 'M' powoduje, że'^$ 'pasuje do każdej linii, a nie do całego ciągu znaków. – chris85

4

Można wymyślić, co następuje:

<?php 
$string =" 
Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 
Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b%"; 

$regex='~ 
     ^\w{3,} # at last three word characters at the beginning of the line 
     -  # a dash 
     \w{3,}$ # three word characters at the end of the line 
     ~xm'; # multiline and freespacing mode (for this explanation) 
       # ~xmu for accented characters 

preg_match_all($regex, $string, $matches); 
print_r($matches); 
?> 

Jako @ chris85 wskazał, \w będzie pasował do podkreślenia, jak również. Trincot miał dobry komentarz (pasujące do znaków akcentowanych). Aby to osiągnąć, simply use the u modifier.
Zobacz a demo on regex101.com i a complete code on ideone.com.

+0

PHP nie będzie działało z wyjaśnieniem tam, powinieneś zrobić to samo w ciele pytania. – chris85

+0

@ chris85, może sprawdź modyfikator 'x' ... – trincot

+0

@ chris85: [Dlaczego nie ???] (http://ideone.com/oMe3Qp) - to jest dokładnie to, do czego służy modyfikator' x'. – Jan

3

Można użyć tego wyrażenia regularnego

^\w{3,}-\w{3,}$ 

^  // start of the string 
\w{3,} // match "a" to "z", "A" to "Z" and 0 to 9 and requires at least 3 characters 
-  // requires "-" 
\w{3,} // same as above 
$  // end of the string 

Regex Demo

5

Jeśli akcentowane litery powinny być dozwolone, lub dowolny inny list, który istnieje w Zakres Unicode (jak grecki lub cyrylica let TER), a następnie za pomocą modyfikatora u (UTF-8) i \pL dopasować litery unikodową (i \d dla cyfr):

$string =" 
Mañana-déjà 
Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 
Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b%"; 

$regex='/^[\pL\d]{3,}-[\pL\d]{3,}$/mu'; 

preg_match_all($regex, $string, $matches); 

var_export($matches); 

wyjściowa:

array (
    0 => 
    array (
    0 => 'Mañana-déjà', 
    1 => 'Text-Text', 
    2 => 'Abc-123', 
    3 => '123-Abc', 
    4 => 'A2C-def4gk', 
), 
) 

Uwaga: różnice w \w jest to, że [\pL\d] nie pasuje do podkreślenia.

2

I krótki.

^([^\W_]{3,8})-(?1)$ 

Demo at regex101

Mój głos dla @ chris85 który jest najbardziej oczywiste i wydajnych.

Powiązane problemy