2016-02-27 6 views
7

Ich habe ein wenig recherchiert, aber ich habe nichts gefunden, das sich genau auf das bezieht, was ich brauche, und wann immer ich versuchte, den Ausdruck zu schaffen, ist es immer etwas abseits von dem, was ich brauche.Reguläre Ausdrücke, erlauben nur spezifisches Format. "John-doe"

Ich versuchte etwas in Richtung [AZaz09]{3,8}\-[AZaz09]{3,8}.

Ich möchte das gültige Ergebnis nur Text-Text, wo entweder oder der Text kann alphabetisch oder numerisch sein, aber das einzige Symbol erlaubt ist - und das ist zwischen den beiden Texten.

Jeder Text muss mindestens drei Zeichen lang sein ({3,8}?), Dann getrennt durch die -.

daher für sie einige Beispiele könnten als gültig sein:

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

Ungültige Tests sein könnte:

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

Möchten Sie Buchstaben mit Akzenten oder andere Alphabete auch zusammenbringen? Wie "déjà-vus", "12μ-13μ", "mañana-1234" – trincot

+0

@trincot: Guter Punkt, habe meine Antwort aktualisiert, um den Modifikator "u" widerzuspiegeln. – Jan

Antwort

10

Sie müssen Anker verwenden und die - so die Zeichen in der Zeichenklasse verwenden werden als ein Bereich gelesen, nicht die einzelnen Zeichen.

Versuchen:

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

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

Sie auch eine, aber mit dem i Modifikator und dem \d Meta-Zeichen vereinfachen könnte.

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

Top scheint für mich perfekt zu sein :) – mhvvzmak1

+0

Ich bemerkte, dass in der Website gibt es/gm am Ende der Regex, was macht dieses GM und ist es erforderlich? – mhvvzmak1

+2

'g' ist ein globaler Modifikator,' m' ist mehrzeilig. Das soll nur demonstrieren. Das 'g' wird in PHP nicht unterstützt. Das "m" bewirkt, dass das Zeichen "^ $" mit jeder Zeile und nicht mit der gesamten Zeichenfolge übereinstimmt. – chris85

4

Sie könnte mit der folgenden:

<?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); 
?> 

Wie @ chris85 darauf hingewiesen, \w wird auch ein Unterstrich entsprechen. Trincot hatte einen guten Kommentar (also passende Akzentbuchstaben). Um dies zu erreichen, simply use the u modifier.
Siehe a demo on regex101.com und a complete code on ideone.com.

+0

Die PHP wird nicht mit der Erklärung dort arbeiten, sollten Sie das im Körper der Frage selbst tun. – chris85

+0

@ chris85, überprüfen Sie vielleicht den 'x' Modifikator ... – trincot

+0

@ chris85: [Warum nicht ???] (http://ideone.com/oMe3Qp) - das ist genau, was der' x' Modifikator ist. – Jan

3

können Sie diese Regex verwenden

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

Wenn Umlaute erlaubt sein sollte, oder jeder anderen Brief, der in der existiert Unicode-Bereich (wie griechisch oder kyrillisch lassen ters), dann mit dem u Modifizierungsmittel (UTF-8-Unterstützung) und \pL Unicode Buchstaben (und \d für Ziffern entsprechen):

$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); 

Output:

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

NB: Der Unterschied bei \w ist, dass [\pL\d] nicht mit einem Unterstrich übereinstimmt.

2

Und ein kurzer.

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

Demo at regex101

Meine Stimme für @ chris85 die naheliegendste und performant ist.