frank
Goto Top

Regular Expressions für unsere Usernamen-Tags: Wer kann es lösen?

Hi,

ich benötige mal wieder bei unseren Regular Expressions etwas Hilfe. Der Username-Tag @ in der Textformatierung funktioniert leider nicht immer einwandfrei. Evtl. findet ihr eine gute Lösung. Hier die Bedingungen:

Hier der Text zum Testen:
Hallo @frank oder @C.R.S. Alternativ noch @C-R-S oder auch noch @-c-r-s- und @.c.r.s. sollten alle funktionieren. Auch @frank-- und @--frank sollten gehen. Super wäre noch, wenn @C.R.S.. mit dem ersten Punkt erkannt wird und der zweite Punkt dann das Satzende ist, also nicht mehr in das @ einfließt. Beispiel: Das ist erst der Anfang von @C.R.S.. Nun folgt der neue Satz.

Hier die aktuelle RegEx-Bedingung, die bei normalen Namen funktioniert, aber Probleme hat, wenn am Ende ein Punkt oder Bindestrich ist:
/(?<=^|\s)@([a-z0-9.-]+)($|\b)/ig

Hier die Seite, um das die Regular Expressions zu prüfen: https://regex101.com/

Ziel ist es, dass auch Nutzernamen mit Punkten oder Bindestrichen mit dem @ Zeichen funktionieren.

Hier die Doku zum PHP-Befehl 'preg-replace', der verwendet wird: http://php.net/manual/en/function.preg-replace.php

Wer hat eine Lösung? Es winken Ruhm und Ehre und der/die User werden natürlich auch in der Release Note dankend erwähnt.

Gruß
@Frank

Content-ID: 299189

Url: https://administrator.de/contentid/299189

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

SeriousEE
Lösung SeriousEE 16.03.2016 aktualisiert um 08:22:33 Uhr
Goto Top
Hallo,

Könnte man noch verfeinern, aber nach meinem Test funktioniert es für die oben genannte Phrase:
/@([\.]?[a-zA-Z\-]+[\.]?)+[a-zA-Z\-]+[\.]?/ig

Edit:
nochmal verkürzt:
/@([\.]?[a-zA-Z\-]+)+[\.]?/ig

Viele Grüße
SeriousEE
Frank
Frank 16.03.2016, aktualisiert am 17.03.2016 um 00:19:54 Uhr
Goto Top
@SeriousEE

sieht gut aus. Für den richtigen Treffer des Namens fehlt noch eine Klammer und [0-9]. Groß- und Kleinschreibung ist mit dem /i erledigt :

/@(([\.]?[a-z0-9\-]+)+[\.]?)/ig

oder zusätzlich mit der Erkennung für den Anfang des Strings (ich denke aber, dass brauchen wir gar nicht mehr).

/(?<=^|\s)@(([\.]?[a-z0-9\-]+)+[\.]?)/ig

Super, damit hätten wir immer beim ersten Match (\\1) den kompletten Namen.

Update: Der neue Code ist nun online und scheint zu funktionieren.

Gruß
Frank