2016-06-09 11 views
0

Ich entwickle eine Laravel-Anwendung, wo ein Benutzer auf sein Profil verweisen kann, indem er seinen Benutzernamen in die entsprechende Form einfügt.PHP Regex Muster für den passenden Benutzernamen

Nehmen wir ein Beispiel sehen:

Ein Benutzer namens John zu seinem Profil verweisen können Sie den folgenden Text ein: @ John

ich mehrere Stunden damit verbracht, wie regex Werke zu verstehen, aber das Muster ist, wo ich habe bis jetzt: @([A-Za-z0-9]+)

Dieses Muster passt perfekt zum obigen Beispiel, aber es passt auch zu anderen Formaten, die es normalerweise nicht sollte.

Ich brauche Hilfe beim Erstellen des perfekten Musters.

Es sollte nur mit einer Zeichenfolge übereinstimmen, die mit dem @ -Symbol beginnt. Zum Beispiel: @John, @Sam, @Bill usw.

Es sollte nicht mit einer Zeichenfolge übereinstimmen, die nicht mit dem @ -Symbol beginnt. Zum Beispiel: a @ John, etwas @ Sam, 123 @ Bill, etc.

Es sollte auch die Formate entsprechen, die mehr als ein @ Symbole enthalten. Zum Beispiel: @ John @, @ Sam @ etwas, @ Bill @@ sometext etc. In diesem Fall ist das Muster erfassen sollte: John @ Sam @ etwas, Bill @@ sometext

Vielen Dank für Ihre Hilfe und Entschuldigung für mein schlechtes Englisch.

+0

Welche Zeichen in diesem „username“ erfasst werden speziell sind erlaubt? – shamsup

+0

In diesen "geeigneten Form [s]" darf der @ @ Benutzername irgendwo in einer Zeichenkette oder nur am Anfang sein? – shamsup

+0

A-Z, a-z, 0-9 Zeichen sind nur erlaubt. – krisk

Antwort

4

sollte diese Arbeit:

(?<=\s|^)@([\[email protected]]+) 

Es gibt eine positive Lookbehind Behauptung der Tag, um sicherzustellen, Leerzeichen vorangestellt ist, oder der Beginn des Strings. Danach ist es nur ein Fall, den @ Charakter zu verbrauchen und den Benutzernamen in eine einfangende Gruppe zu setzen.

Regex demo

+0

Tipps: '(? <= \ S | ^)' ist das gleiche als '(?

+0

Funktioniert perfekt. Vielen Dank! – krisk

-1

Versuchen /(?:\[email protected]{1,3})([[email protected]]+)/i


@ Charakter Erklären. Entspricht einem "@" -Zeichen (Zeichencode 64). {1,3} Quantifizierer. Match zwischen 1 und 3 des vorherigen Token.

\ w Wort. Entspricht einem beliebigen Wortzeichen (alphanumerisch & Unterstrich). + Plus. Match 1 oder mehr des vorhergehenden Token.

Hier ist regexr: http://regexr.com/3djhq

+0

Das entspricht fälschlicherweise dem Beispiel "a @ john" und passt im Beispiel "@ Sam @ something" doppelt statt einmal. – duskwuff

+0

@duskwuff: Danke für das Hinzeigen. Jetzt ignoriert dies Leerzeichen und erlaubt @ in Benutzername. –

0

Ihre regex fast korrekt ist. Erstens möchten Sie sagen, dass Ihre Regex auch den Beginn der Zeichenfolge übereinstimmen sollte. Sie können die mit Caret-Zeichen (^) erreichen:

^@([A-Za-z0-9]+) 

Zweitens Sie wollen innerhalb des @ -Zeichen in der Lage sein zu setzen. Jetzt ist es einfach - fügen Sie einfach dieses Symbol in die Klammern ein.

^@([[email protected]]+) 
+0

Das '^' würde die Regex ** nur ** mit Benutzernamen übereinstimmen, die am Anfang eines Strings erscheinen, was ich nicht für wünschenswert halte. – duskwuff

+0

Haha, auch ich habe die Frage nicht sehr klar gelesen und schon dieselbe Antwort gegeben. @duskwuff ist richtig. – gview

+0

Nun, der Autor hat gesagt, dass _It sollte nur eine Zeichenfolge, die mit dem @ -Symbol beginnt – lukeg

Verwandte Themen