Regex Syntax - ich blicks nicht...
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anfang
anregung
code
dank
email
ende
feld
forum
frage
http
problem
schritt
syntax
telefonnummer
test
umlaut
url
versuch
zeichen
zeile
-
Ich murkse nun schon 4h dran rum, habe mir durchgelesen und ausprobiert, was auf http://de2.php.net/manual/de/reference.pcre.pattern.syntax.php steht, aber es will immernochnicht und ich steige nicht wirklich dahinter
Problem: ich habe ein paar Eingabefelder in einem Formular, die ich individuell auf Falscheingaben (zB xss) prüfen will und dann soll die Verarbeitung abbrechen. Die Prüfung möchte ich mit preg_match machen und zwar:
if preg_match(..verboteneZeichen..) abbruch;
Ich könnte auch die erlaubtenZeichen negieren, also alle anderen als die angegebenen...
Ich weiß schon garnicht, wie man ein Leerzeichen schreibt. :space: ist ja mehr als \s und eine Lücke in [ ] geht nicht, ist es der Unterstrich vielleicht??
Feld 1: Nameseingabe, zulässige Zeichen wären a-z, Leerzeichen, Bindestrich, Umlaute
preg_match('/^[a-zA-Z_\-öäüÖÄÜß]/',$mystr) ... funzt nicht (wenn da jemand "<script>" reinschreibt, brichts nicht ab).
Feld 2: Telefonnummer, da wären möglich 0-9 und / und Leerzeichen, Plus, Minus, vielleicht auch Klammern.
Feld 3: eMail: a-z, punkt, @ und Unterstrich
Bitte verrate mir die Syntax, oder was ich besser machen könnte -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Was ich mich zuerst frage: Wieso prüfst du auf Zeichen, die nicht vorhanden sein drüfen? In meinen Augen macht es mehr Sinn, wenn du wirklich per Regex vorgibts, wie die Zeichenkette aufgebaut sein muss. Der Vorteil dabei ist, denke ich, dass man wenn man bisschen im Regex geübt ist direkt das - sagen wir Template - lesen zu können.
Versuch für Feld 1 mal folgendes:
-> nach [] ein +, um anzugeben, dass mehr als nur ein Zeichen validiert wird, am Ende des Regex ein $ - es ist das Gegenteil von ^ und gibt somit an, dass das Regex dort zuende ist./^[a-zA-Z_\-öäüÖÄÜß]+$/
Feld 2: Dafür hab ich persönlich schon viele Regex Scripte gesehen, kannst ja mal Googlen und fremde übernehmen oder dir so Anregungen holen. Um selbst ein Script zu schreiben musst du dir erstmal klar werden wie genau können die verschiedenen Arten der Telefonnummern aussehen, die schreibst du dir auf und überlegst dir eine mögliche Lösung die alle Fälle abdeckt.
Feld 3: Ähnlich wie Feld2, allerdings kannst du hier schon von einem Regex in folgende Richtung ausgehen/^[a-zA-Z0-9_]+\@[a-zA-Z]+\.(de|com|net|[a-zA-Z]+)$/
Dieses Script sollte dir natürlich nur eine Anregung geben, wurde nicht getestet und bittet um Verbesserung ;)
Beitrag zuletzt geändert: 9.12.2013 23:07:57 von copynpaste -
Erstmal danke für deine Antwort. Ich habe derweil weitergelesen und rumprobiert, aber es klappt noch nicht.
copynpaste schrieb:
Weil nur Spammer/Hacker bestimmte Zeichen verwenden und alle anderen sollen es nicht
Was ich mich zuerst frage: Wieso prüfst du auf Zeichen, die nicht vorhanden sein dürfen?
Versuch für Feld 1 mal folgendes:
Irgendwie gibt es da unterschiedliche Aussagen, wozu ^ und $ sind; das fand ich noch in einem anderen Forum:
-> nach [] ein +, um anzugeben, dass mehr als nur ein Zeichen validiert wird, am Ende des Regex ein $ - es ist das Gegenteil von ^ und gibt somit an, dass das Regex dort zuende ist./^[a-zA-Z_\-öäüÖÄÜß]+$/
^ bedeutet dass das script nur zeichenketten am ANFANG matcht
Der Betreffende hat es dann entfernt und es lief bei ihm; bei mir aber nicht
$ bedeutet, dass das script nur zeichenketten am ENDE matcht
beides zugleich geht schwer
Da das erste noch nicht funktioniert, habe ich an den anderen noch nicht weiter gedacht. -
Wie wäre es so?
$name = '/^[-a-zA-ZäöüÄÖÜß ]+$/'; $phone = '/^\\+?[ 0-9\\/\\(\\)-]+$/';
mathesoft schrieb:
Irgendwie gibt es da unterschiedliche Aussagen, wozu ^ und $ sind; das fand ich noch in einem anderen Forum:
^ bedeutet dass das script nur zeichenketten am ANFANG matcht
$ bedeutet, dass das script nur zeichenketten am ENDE matcht
beides zugleich geht schwer
= Zeilenanfang (oder innerhalb von^
eine Negierung)[]
= Zeilenende$
Sowas matcht nur, wenn das am Zeilenanfang steht:^abc
Sowas hingegen nur, wenns am Zeilenende steht:
.bla$
Mischen lässt sichs trotzdem:
(Hierbei darf die Zeile nur »abc« enthalten).^abc$
Und was du hattest:
, die Zeile muss ausschließlich aus Buchstaben bestehen.^[a-zA-Z]+$
-
Regexen sind echt 'ne tolle Sache. Ich setze sie unabhängig von der gerade verwendeten Programmiersprache gerne und häufig ein um nicht-triviale Muster auszuwerten. Du lernst die Systematik einmal lernen, wie vom TE beschrieben nicht unbedingt schmerzlos, kannst dich danach aber beruhigt zurücklehnen und sparst dir à la longue sehr viel Zeit und Mühe.
Einige Tipps zu Aufzucht und Pflege:
-Testmuster in eine separten Datei zusammenfassen und damit testen. Nicht mit positiven und negativen matches sparen, insbesondere auf Randbedingungen achten. Stichwort: Unit-Tests
-wichtige getestete Muster in einer extra Datei sammeln und damit einfach wiederverwendbar machen. Beispiele: Telefonnummer, URL, Geldbetrag etc.
-die Testmuster Schritt-für-Schritt erweitern, bei Fehlern einen Schritt zurück und intensiv nachdenken:-)
-Regexen können auch mehrere Elemente eines Suchbefriffes auf einmal identifizieren und als Resultat zurückliefern.
-In der .htaccess eingesetzt lassen sich damit hübsche Dinge umsetzen.
Hier noch ein einführender link http://webcheatsheet.com/php/regular_expressions.php sowie ein Online-Schnelltest http://www.phpliveregex.com/. -
Hallo
beachte bei äöüÄÖÜß in RegEx Pattern auch den Charset !!!
wenn Du
machst$name ='/^[-a-zA-ZäöüÄÖÜß ]+$/';
muss der String auch in Charset ISO-8859-15 vorliegen
(oder anderes Charset das deutsche Umlaute hat)
Meist liegt der String in UFT-8 vor,
dann musst Du auch im RegEx Pattern die Umlaute als UTF-8 Zeichen haben
und ggf. auch Modifier /u für UTF-8 anhängen
$umlaute = utf8_encode('äöüÄÖÜß'); $name ='/^[-a-zA-Z'.$umlaute.' ]+$/u'; preg_match($name,$mystr,$matches)
Code nicht getestet .. nur als Hinweis, dass man auf Charset (ISO / UTF-8) achten muss !!
-
copynpaste schrieb:
Feld 3: Ähnlich wie Feld2, allerdings kannst du hier schon von einem Regex in folgende Richtung ausgehen/^[a-zA-Z0-9_]+\@[a-zA-Z]+\.(de|com|net|[a-zA-Z]+)$/
Dieses Script sollte dir natürlich nur eine Anregung geben, wurde nicht getestet und bittet um Verbesserung ;)
Am besten
benutzen.filter_var('bob+test@example.com', FILTER_VALIDATE_EMAIL);
Habe auf vielen Seiten Probleme mit meiner eMail-Adresse, weil ich ein "+" drin hab.
Selbst größere Seiten à la Microsoft sind zu doof dafür. :(
Lustig wird’s wenn sie die Validierung umstellen und man sich nicht mehr einloggen kann (und man auch die Adresse nicht mehr ändern kann). -
Hallo,
erstmal danke für die Tipps und Hinweise, ich schätze das sehr (leider kann ich dafür noch keine Bewertungen verteilen).
Da ich derzeit was anderes erledigen muss, habe ich das Thema erstmal auf Wiedervorlage gesetzt, also mache ich ein andermal damit weiter; wollte mich einfach zunächst bedanken
Gelöst hab ichs noch nicht... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage