| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

31-01-2011, 11:26
|
|
Jona
Registrierter Benutzer
|
|
Registriert seit: Aug 2004
Beiträge: 17
|
|
Suchmuster - Zeichenreihenfolge
Ich beschäftige mich gerade mit Suchmustern für ein Formular und bin dabei auf folgende Eigenart gestoßen, für die ich keine Erklärung habe:
Folgende Abfrage funktioniert:
Code:
if (!preg_match("/^[a-zA-ZäÄüÜöÖß0-9-.].*[a-zA-ZäÄüÜöÖß0-9-.]+$/", $_POST["strasse"])){
$message4a="<span class='message'>Bitte nur Buchstaben</span><br>";
}
nimmt man jedoch die 0-9 aus dem Suchmuster , bewirkt der Punkt innerhalb der eckigen Klammer, dass die Abfrage nicht mehr funktioniert. Wechselt man die Reihenfolge von Bindestrich und Punkt funktioniert es wieder.
Funktioniert nicht:
Funktioniert:
Aber warum? Müsste die Reihenfolge der erlaubten Zeichen innerhalb einer Charakterklasse nicht eigentlich egal sein oder welche Faktoren spielen da noch eine Rolle. Würde mich freuen, falls Ihr eine Erklärung habt.
|

31-01-2011, 12:09
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
. steht für jedes beliebige Zeichen. Also dein Code lässt alle Zeichen zu. Wenn du Punkt als Zeichen verwenden willst, musst du es escapen.
|

31-01-2011, 12:21
|
|
Jona
Registrierter Benutzer
|
|
Registriert seit: Aug 2004
Beiträge: 17
|
|
Danke, habe jetzt \ eingefügt, aber witziger Weise bleibt es auch dann dabei, dass die Reihenfolge von Punkt und Bindestrich eine Rolle spielt.
Funktioniert:
Funktioniert nicht:
Warum
|

31-01-2011, 12:25
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
was h3ll sagt, trifft auf Zeichenklassen natürlich nicht zu, aber der Bindestrich hat dort eine Sonderbedeutung. Wenn du 0-9 schreibst, verwendest du ihn, um einen Bereich abzudecken. Mit ß-. ist das dasselbe, nur das der Bereich ungültig ist (weil . schon weit vor ß kommt). Du musst in Zeichenklassen also den Bindestrich escapen, nicht den Punkt, wenn du wirlich einen Bindestrich meinst.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

31-01-2011, 12:32
|
|
Jona
Registrierter Benutzer
|
|
Registriert seit: Aug 2004
Beiträge: 17
|
|
Danke Amica, jetzt klappt es. Wußte noch nicht, dass der Bindestrich eine Sonderbedeutung hat, auch wenn er nicht zwischen 0-9 steht. Vielen Dank Euch beiden, habe wieder was dazugelernt.
Viele Grüße Jona
|

31-01-2011, 12:34
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
@h3ll: aus dem Manual: "Dot has no special meaning in a character class."
@Jona: $_POST['strasse'] = 'aaa' führt zur Meldung "bitte nur Buchstaben" 
Wieso soll ein Strassennahme eigentlich nur aus Buchstaben bestehen bzw. was meinst du in diesem Zusammenhang mit "Buchstaben"? Wie gefällt die "Strasse des 17. Juni"?
|

01-02-2011, 10:56
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Wer reguläre Ausdrücke verwenden möchte, um Buchstaben zu erkennen, ist gut beraten, den UTF-8-Modus einzuschalten und dann die passende Unicode-Character-Class zu verwenden. Also etwa so:
PHP-Code:
// Buchstaben groß und klein
preg_match('/\A\pl+\z/u', $input);
// Straßennamen (Vorschlag)
preg_match('/\A[\pl+0-9-\s]+\z/u', $input);
Das erlaubt immer noch, Unsinn einzugeben, aber ich kenne keine vorgeschriebene Mindest-Länge für Straßennamen ...
Zitat:
Zitat von onemorenerd
...
Wieso soll ein Strassennahme eigentlich nur aus Buchstaben bestehen bzw. was meinst du in diesem Zusammenhang mit "Buchstaben"? Wie gefällt die "Strasse des 17. Juni"?
|
Ja, und Leerzeichen sollen auch in Straßennamen öfter vorkommen, als man denkt. Auch in Deutschland soll es Straßen geben, die nach Leuten benannt wurden, deren Namen bspw. lustige französische Buchstaben mit Akzent beinhalten. Dann wären da noch die nationalen Minderheiten, die auch gerne vom bekannten lateinischen Alphabet abweichende Buchstaben benutzen.
Vorsorglich möchte ich auch darauf hinweisen, dass Hausnummern nicht nur aus Ziffern bestehen müssen.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (03-02-2011 um 12:19 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|