# Reguläre Ausdrücke mit Umlauten.



## aleks (9. Januar 2006)

Hallo Zusammen,
ich hab ein paar Jahre hier nur einfach mitgelesen. Jetzt habe ich ein Problem wo ich nicht weis wie es lösen kann vielleicht hab Ihr ja eine Idee.

Also ich für die Überprüfung eines Formularfeldes folgenden regulären Ausdruck: ([A-Z])([a-z+\-]+)$. Jetzt ist mein Problem, wenn ich in das Feld z.B. den Namen Krüger schreibe und dann das Script ausführe behauptet es das es mit der Vorgabe nicht überein stimmt. Also wie mache ich das, daß es die Umlaute wie normale Buchstaben behandelt? Wer kann mir helfen?


----------



## Sven Mintel (9. Januar 2006)

Du musst die Umlaute in der Zeichenklasse gesondert angeben...da sie nicht innerhalb des Bereiches a-z enthalten sind, sondern danach folgen:
*[a-zäöü]*
Selbiges gilt für ß

Je nach System kann auch *[^\W_]* ausreichen.


----------



## aleks (9. Januar 2006)

Cool das ging schnell! Besten Dank Sven Mintel, es funktioniert  .Mein Code sieht jetzt so aus:
	
	
	



```
$Plotter = "([A-ZÄÖÜ])([a-zäöüß+\-]+)-([A-ZÄÖÜ])([a-zäöüß\-]+)$";
	if(!ereg($Plotter,$_POST['vorname']))
	{
	  $allesok = 0;
	  $error[vorname]="<b><span style=\"color:red;\">*</span></b>";
	}
```
. Jetzt muß der User am Anfang groß Schreiben und auch nach dem Bindestrich (-).


----------



## Gumbo (9. Januar 2006)

Dein Ausdruck besagt jedoch auch, dass die Zeichenkette einen Bindestrich enthalten muss.


----------



## Sven Mintel (9. Januar 2006)

Kleiner Tipp:
Ich weiss nicht, wofür genau du diese Prüfung brauchst, aber wenn nicht die Welt untergeht, dass ein Name nicht deinen Regeln entspricht, dann würde ich mich darauf beschränken, welche Zeichen garantiert nicht vorkommen dürfen.

Grund: die Welt ist gross, es gibt viele Buchstaben... nicht nur die auf einer deutschen Tastatur.
Soetwas wie die deutschen Umlaute gibt es in vielen Sprachen, dazu kommen Interpunktionszeichen.

Der Schaden ist vergleichsweise tragischer, wenn jemand nicht durch deine Prüfung kommt, weil sein Name nicht deinem Muster entspricht.


----------



## aleks (9. Januar 2006)

Also ich bin grad am basteln eines Formulars für eine Registrierung.
 Und da ich der Meinung bin das Namen groß geschrieben(oder etwa nicht), werden hab ich mir eben diese Regel ausgedacht. Sicher man hätte drauf verzichten können, bloß dann hätte ich später Namen groß und- klein geschriebene Namen in meiner Datenbank stehen.
 Ich hoffe es ist jetzt verständlich geworden.


----------



## Sven Mintel (9. Januar 2006)

Gut....die Grossschreibung am Anfang kannst du perSkript erledigen([phpf]ucfirst[/phpf])


Worauf ich hinauswollte....André oder bspw. ein Herr Hoëcker ....nach meiner Erfahrung bestehen solche Leute auf ihre Namenszutaten: bei dir ginge dies nicht.


----------



## aleks (9. Januar 2006)

Stimmt Gumbo. Und wie muß ich das Formulieren wenn es ein Bindestrich gibt, dann muß der nächste Buchstabe groß geschrieben werden.


----------



## Gumbo (9. Januar 2006)

Ebenso wie Sven halte ich diese Prüfung der korrekten Groß- und Kleinschreibung eines Vornamens für überflüssig oder unnötig kompliziert. Wie Sven es schon erwähnte, würde auch ich nur nichterlaubte Zeichen ausschließen anstatt irgendwelche komplizierte Ausdrücke zu entwickeln, die am Ende doch nichts nutzen.


----------



## aleks (9. Januar 2006)

> Worauf ich hinauswollte....André oder bspw. ein Herr Hoëcker ....nach meiner Erfahrung bestehen solche Leute auf ihre Namenszutaten: bei dir ginge dies nicht.


Interessant also é gibt es glaube ich im französischen aber ë kenne ich keine Sprache die diesen Buchstabe verwendet. Bestimmt gibt noch mindestens ein duzten solcher Sonderbuchstabe. Aber woher weis ich denn welcher Buchstaben ich noch berücksichtigen muß?


----------



## Gumbo (9. Januar 2006)

Das Trema bei „Hoëcker“ kennzeichnet eine Diärese, also die getrennte Aussprache von aufeinander folgenden Vokalen. Das Akzent Akut kennzeichnet bei „André“ eine schärfere Aussprache des E-Vokals.


----------



## Sven Mintel (10. Januar 2006)

aleks hat gesagt.:
			
		

> Aber woher weis ich denn welcher Buchstaben ich noch berücksichtigen muß?



Das ist es, was ich meine. Prinzipiell musst du alle Buchstaben berücksichtigen....ich bin zwar kein Sprachwissenschaftler, aber ich glaube nicht, dass es viele Buchstaben auf der Welt gibt, die speziell in der Namensgebung untersagt sind.

Und es geht noch weiter, was ist bspw. mit d'Artagnan ?


----------



## Gumbo (10. Januar 2006)

Die Zeichen, die du definitiv ausschließen kannst, sind wohl die Steuerzeichen (U+0000–U+001F, U+007F).


----------



## aleks (11. Januar 2006)

Also erst einmal danke für eure Tipps. Mein Code sieht jetzt so aus:
	
	
	



```
$_POST['vorname'] = ucfirst($_POST['vorname']);
$Plotter = "([a-zäöüëéïß\-']+)$"; 
	if(!ereg($Plotter,$_POST['vorname']))
	{
	  $allesok = 0;
	  $error[vorname]="<b><span style=\"color:red;\">*</span></b>";
	}
```
. Ich hab jetzt nur ein Problem wenn ich ein ' Zeichen eingebe wird das dan durch \' ersetzt. Wie bekomme ich das richtig dargestellt?


----------



## Gumbo (11. Januar 2006)

Wieso bist du so erpicht darauf, dass nur bestimmte Buchstaben bei der Nennung eines Vornamens erlaubt sind – und dann auch noch nur so wenige?


----------



## imokcan (11. Januar 2006)

Den Zweck dieser Funktion verstehe ich leider auch nicht. Was ist mit
François?
Génève?
ôóòø?

Und ich weiß nicht wie vielen anderen noch?


----------



## aleks (12. Januar 2006)

> Wieso bist du so erpicht darauf, daß nur bestimmte Buchstaben bei der Nennung eines Vornamens erlaubt sind – und dann auch noch nur so wenige?



Was soll ich denn machen? Soll ich denn alle Buchstabe die auf dem lateinischen Alphabet basieren (z.B. deutsch, französisch, italienisch, spanisch und noch viele mehr), erlauben? 

Eigentlich hatte ich nur vor das deutsche Alphabet zu erlauben. Und wenn ja wie geht das?
Wäre wenn ihr mir einen Tipp für mich hättet. Mitleweile bin ich von der ganzen Diskussion ziemlich verwirt.


----------



## imokcan (12. Januar 2006)

Ich nehme an du möchtest, dass deine User ihren wahren Namen angeben, statt irgendeinen Nick, oder irre ich mich? Ich mit mjb könnte mich doch trotzdem einloggen?

Ich glaube es wäre viel einfacher, wenn du eine Notiz neben das Eingabefeld schreiben würdest, dass nur reguläre Zeichen erlaubt seien.

Oder liege ich komplett falsch?


----------



## Gumbo (12. Januar 2006)

> Was soll ich denn machen? Soll ich denn alle Buchstabe die auf dem lateinischen Alphabet basieren (z.B. deutsch, französisch, italienisch, spanisch und noch viele mehr), erlauben?


Wieso nicht?
	
	
	



```
preg_match('/[a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\xFF]/Us', $string)
```


----------



## aleks (13. Januar 2006)

Danke erstmal für die schnell Antwort Gumbo. Habe es auch schon ausprobiert es funktioniert!  
 Wäre nett wenn Du mir erklären könntest was dieser Ausdruck macht





> \xC0-\xD6\xD8-\xF6\xF8-\xFF]/Us'


macht bzw. wo das das nach lesen kann. Ein Problem hätte ich immernoch wenn ich ein Apostroph (')eingebe wird das immer durch \' ersetzt. Was muß ich machen damit das nicht ersetzt wird.

So jetzt zu imokcan. Es handelt sich um ein Feld in einem Formular wo der Benutzer seinen Namen eingibt. Die Idee mit Notizen ist eigentlich ganz gut, bloß versteht jeder darunter etwas anderes.


----------



## Gumbo (13. Januar 2006)

Der Ausdruck beschreibt alle lateinischen Buchstaben des UTF-8-Zeichensatzes im Raum der ersten 265 Zeichen. Dass dem Apostroph immer ein Fluchtzeichen vorangesetzt wird, liegt wahrscheinlich daran, dass die so genannten Magic Quotes aktiviert sind.


----------



## SilentWarrior (13. Januar 2006)

> Ich hab jetzt nur ein Problem wenn ich ein ' Zeichen eingebe wird das dan durch \' ersetzt. Wie bekomme ich das richtig dargestellt?


[phpf]stripslashes[/phpf].

Wenn wir grad beim Thema unsinnige RegExp sind: Es gibt leider immer noch viel zu viele deutsche Websites mit internationalem Zielpublikum, die davon ausgehen, dass Postleitzahlen überall auf der Welt 5-stellig sind. Nur leider ist das schon ein Land weiter unten nicht mehr so … darüber reg ich mich oft auf. So, das musste mal raus.

Back to topic: Ein umfangreicher, auf dem Ausschlussverfahren beruhender regulärer Ausdruck für Eigennamen fänd ich überaus interessant. Es gibt doch sicher noch weitere Zeichen ausser den Steuerzeichen, die nicth vorkommen können: Zahlen, fast alle Interpunktionszeichen (ich würde sagen, bis auf ’ - . , eigentlich alle.) usw. – da kommt ganz schön was zusammen.


----------



## Sven Mintel (13. Januar 2006)

Ein ß am Anfang wäre auch recht unwahrscheinlich.

Aber im Grunde genommen würde ich sagen, dass man, solange es keine verbindlichen Regeln für Namensgebung gibt, ist es unmöglich, da etwas zu bewerkstelligen.

Nicht mal Zahlen würd ich ausschliessen.... sonst wäre das unfair gegenüber bspw. der englischen Queen


----------



## aleks (17. Januar 2006)

Hallo erst einmal noch mal ein großes Dankeschön an alle die sich beteiligt haben.  
Meine Problemlösung sieht so aus: 
	
	
	



```
if(empty($_POST['vorname']))
 {
  $allesok = 0;
  $error[vorname] = "<b><span style=\"color:red;\">*</span></b>";
}
else
{
$_POST['vorname']=trim(stripslashes($_POST['vorname']));
$_POST['vorname'] = ucfirst($_POST['vorname']);
$Plotter = "/[a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\xFF]/Us"; 
	if(!preg_match($Plotter,$_POST['vorname']))
	{
	  $allesok = 0;
	  $error[vorname]="<b><span style=\"color:red;\">*</span></b>";
	}
}
```
. Natürlich kann man solch' ein Thema noch endlos weiter diskutieren jedenfalls für mich ist die funktion optimal.


----------

