Seite 1 von 1

Regex für Vorname[leer]Nachname im Anmeldeformular

Verfasst: 24.02.2012, 13:34
von euroexchange.de
Hallo @all.

Also mit Regex stehe ich auf Kriegsfuss, hoffe aber, das es hier ein paar Profis gibt, die mir bei der Lösung helfen können.

Ich möchte in einem Anmeldeformular in einem Feld gemeinsam Name und Vorname prüfen lassen und nur zulassen, wenn die Angaben in Ihrer Form den folgenden Kriterien entsprechen:

Paul Mustermann
Paul Mustermann Krammer
Paul Mustermann-Krammer

Hans Paul Mustermann
Hans-Paul Mustermann
Hans Paul Mustermann Krammer
Hans-Paul Mustermann Krammer
Hans-Paul Mustermann-Krammer

Jeweils der erste Buchstabe (H)ans (P)aul (M)ustermann (K)rammer muß ein Großbuchstabe sein.

Bisher habe ich:

Code: Alles auswählen

^[A-ZÄÖÜ\.-][a-zäöü\.-]+ [a-zA-ZäöüÄÖÜ-]+ [a-zA-ZäöüÄÖÜ-]
Jemand eine Idee? Danke!

Verfasst:
von

Verfasst: 25.02.2012, 01:42
von Melegrian
Ist ungetestet, doch ich würde so beginnen und falls es dann funktionieren sollte, alle drei Zeilen nach dem Schema (erstes Muster|zweites Muster|drittes Muster) zusammenfügen. Mag aber sein, dass die Muster noch nicht perfekt sind, dazu mache ich das zu selten und einfacher ginge es mit explode() und strstr().

Code: Alles auswählen

Erstes Muster sollte finden: 

Paul Mustermann

([A-ZÄÖÜ]{1,1})([a-zäöü]+)\s{1,1}([A-ZÄÖÜ]{1,1})([a-zäöü]+)



Zweites Muster sollte finden: 

Paul Mustermann Krammer
Paul-Mustermann Krammer
Paul Mustermann-Krammer

([A-ZÄÖÜ]{1,1})([a-zäöü]+)(\s{1,1}|-{1,1})([A-ZÄÖÜ]{1,1})([a-zäöü]+)(\s{1,1}|-{1,1})([A-ZÄÖÜ]{1,1})([a-zäöü]+)



Drittes Muster sollte finden: 

Hans Paul Mustermann Krammer
Hans-Paul Mustermann Krammer
Hans-Paul Mustermann-Krammer

([A-ZÄÖÜ]{1,1})([a-zäöü]+)(\s{1,1}|-{1,1})([A-ZÄÖÜ]{1,1})([a-zäöü]+)\s([A-ZÄÖÜ]{1,1})([a-zäöü]+)(\s{1,1}|-{1,1})([A-ZÄÖÜ]{1,1})([a-zäöü]+)
Ganz verkehrt kann es jedenfalls nicht sein, denn das funktioniert schon einmal:

Code: Alles auswählen

$teststr = "Marlene ist schön und Paul Mustermann-Krammer ist es nicht.";

$muster  = '/([A-ZÄÖÜ]{1,1})([a-zäöü]+)(\s{1,1}|-{1,1})([A-ZÄÖÜ]{1,1})([a-zäöü]+)(\s{1,1}|-{1,1})([A-ZÄÖÜ]{1,1})([a-zäöü]+)/';
preg_match($muster, $teststr, $treffer);

echo $treffer[0]."\n";  

// Ausgabe: Paul Mustermann-Krammer 

Verfasst: 25.02.2012, 14:41
von Melegrian
Findet schon einmal alle drei Namen im Teststring, ist aber noch nicht perfekt. Das ginge sicherlich noch besser:

Code: Alles auswählen

<?php

$testst = "Marlene ist schön und Paul Mustermann-Krammer ist es nicht, doch dafür ".
          "ist Heidi-Ärenika Musterfrau-Übach so blond wie Max Mustermann.";


$muster1 = "/&#40;&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;\s&#123;1,1&#125;&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;&#40;\s|\.&#41;&#41;/";
$muster2 = "/&#40;&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;&#40;\s&#123;1,1&#125;|-&#123;1,1&#125;&#41;&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;&#40;\s&#123;1,1&#125;|-&#123;1,1&#125;&#41;&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;&#40;\s|\.&#41;&#41;/";
$muster3 = "/&#40;&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;&#40;\s&#123;1,1&#125;|-&#123;1,1&#125;&#41;&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;\s&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;&#40;\s&#123;1,1&#125;|-&#123;1,1&#125;&#41;&#40;&#91;A-ZÄÖÜ&#93;&#123;1,1&#125;&#41;&#40;&#91;a-zäöü&#93;+&#41;&#41;/";

$i = 1;

for &#40;$i; $i <= 3; $i++&#41; &#123;

	if &#40;$i === 1&#41; &#123;$muster = $muster1;&#125;
	if &#40;$i === 2&#41; &#123;$muster = $muster2;&#125;
	if &#40;$i === 3&#41; &#123;$muster = $muster3;&#125;

	preg_match&#40;$muster, $testst, $treffer&#41;;

	if &#40;!empty&#40;$treffer&#91;0&#93;&#41;&#41; &#123;

	echo $treffer&#91;0&#93;."<br>\n"; 
    &#125;
&#125;

/* Ausgabe&#58; 
  
   Max Mustermann.
   Paul Mustermann-Krammer
   Heidi-Ärenika Musterfrau-Übach
*/
?>
Zur Überprüfung eines Formulars könnte es bereits reichen, zum Durchsuchen von Dateien wäre es noch nicht ausreichend.

Und wie viele Namen gibt es, die mit Umlauten beginnen? Könnte man eventuell bei den Anfangsbuchstaben weglassen, damit die Muster kürzer werden.

Verfasst:
von

Verfasst: 25.02.2012, 18:06
von Melegrian
Denke, so sollte es richtig sein. Hatte schon mal ein Tutorial über RegEx begonnen, das werde ich mal heute mit einer zweiten Seite fortsetzen. Wäre die Frage nicht gekommen, hätte ich mir die Fortsetzung des Tutorials für spätere Zeiten aufgespart.

Code: Alles auswählen

<?php

if &#40;isset&#40;$_GET&#91;"namen"&#93;&#41; and !empty&#40;$_GET&#91;"namen"&#93;&#41;&#41; &#123;

$teststr = trim&#40;$_GET&#91;"namen"&#93;&#41;;

$muster1 = "/&#40;\A&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;\s&#123;1,2&#125;&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;\Z&#41;/";
$muster2 = "/&#40;\A&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;&#40;\s&#123;1,2&#125;|-&#123;1&#125;&#41;&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;&#40;\s&#123;1,2&#125;|-&#123;1&#125;&#41;&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;\Z&#41;/";
$muster3 = "/&#40;\A&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;&#40;\s&#123;1,2&#125;|-&#123;1&#125;&#41;&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;\s&#123;1,2&#125;&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;&#40;\s&#123;1,2&#125;|-&#123;1&#125;&#41;&#40;&#91;A-Z&#93;&#123;1&#125;&#41;&#40;&#91;a-zäöüß&#93;+&#41;\Z&#41;/"; 


$i = 1;

for &#40;$i; $i <= 3; $i++&#41; &#123;

	if &#40;$i === 1&#41; &#123;$muster = $muster1;&#125;
	if &#40;$i === 2&#41; &#123;$muster = $muster2;&#125;
	if &#40;$i === 3&#41; &#123;$muster = $muster3;&#125;

	preg_match&#40;$muster, $teststr, $treffer&#41;;

	if &#40;!empty&#40;$treffer&#91;0&#93;&#41;&#41; &#123;

	echo htmlentities&#40;$treffer&#91;0&#93;, ENT_QUOTES&#41;."<br>\n<br>\n"; 
    &#125;
&#125;&#125;

echo "\t<form name=\"Eingaben\" action=\"".basename&#40;$_SERVER&#91;"PHP_SELF"&#93;&#41;."\" method=\"get\" accept-charset=\"iso-8859-1\">\n".
     "\t<input type=\"text\" name=\"namen\" value=\"\" size=\"30\" maxlength=\"58\">\n".
     "\t<input type=\"submit\" value=\"Test\">\n".
     "\t</form>\n\n";
?>
Alle Eingaben, die nicht den Beispielen von Paul Mustermann bis Hans-Paul Mustermann-Krammer entsprechen, werden nicht ausgegeben. Auf Umlaute als Anfangsbuchstaben von Namen wurde verzichtet, da wohl eher eine Seltenheit. Das Beispiel beruht auf ein Dokument mit der Zeichenkodierung ISO-8859-1:

Code: Alles auswählen

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">