Hilfe bei Pattern

Alice

Erfahrenes Mitglied
Hallo.

Ich bin mittlerweile kein PHP-Anfänger mehr und habe - dank dieses Forums - sehr viel gelernt. Aber das mit den Pattern will einfach nicht in meine Birne.

Bitte habt Nachsicht...

PHP:
if (preg_match("/^({[A-ZÄÖÜ]}){{3},{50}}$/", $Var_ID))
{
   ...
}
   else
{
   ...
}

Der Teil den ich weder durchschaue, noch auch nur ansatzweise verstehe:

PHP:
"/^({[A-ZÄÖÜ]}){{3},{50}}$/"

Ich möchte ein paar Formularangaben nach Mindest- und Maximallänge und vorallem nach unerwünschten Zeichen durchsuchen.

Folgende Zeichen sollen erlaubt sein:
A-Z
a-z
Ä ä Ö ö Ü ü
ß
0-9
-
_
.
,
!
?
@

%
+

Das "preg_match" soll eine Whitelist sein.
 
Hallo Alice

Das ist ein regulärer Ausdruck (offenbar in etwas anderer Syntax als normal mit den vielen { }). Dazu gibt es ganz viele Tutorials, aber zu deinem Ausdruck:
^ steht in diesem Fall für den Zeilenanfang
$ für das Zeilenende
[A-ZÄÖÜ] sagt so viel wie "Ein Buchstabe aus 'A-Z' (also A, B, C, ....) oder 'Ä' oder 'Ö' oder 'Ü'".
{3, 50} heisst "Mindestens 3 mal das vorhergehende, maximal 50 mal".

In Worten ausgedrückt bedeutet der Ausdruck also:
"Nach dem Zeilenstart darf zwischen 3 und 50 mal ein Buchstabe zwischen A und Z oder Ä, Ö, Ü kommen, anschliessend muss das Zeilende erreicht sein."

Hier siehst du eine Visualisierung davon:
https://www.debuggex.com/r/i_8GoDUdoZjYbwg8

/Edit:
Eine Möglichkeit wäre folgender Ausdruck (inklusive spaces mit \s)
^([A-ZÄÖÜa-zäöü0-9-_\.,!?@%+ß\s]){3,50}$

Viele Grüsse
Cromon
 
Zuletzt bearbeitet:
Tipps/Info:

Der Punkt "." muss in Zeichenklassen "[…]" nicht escapet werden.

"\s" schließt nicht nur Leerzeichen ein, sondern Whitespace allgemein (Tabs, Zeilenumbrüche, …).

Die runden Klammern können weg.

"$" matcht das Eingabeende oder "\n" und das Eingabeende. Anders gesagt: Wenn die Eingabe mit einem "\n"-Zeilenumbruch endet, wird sie dennoch als korrekt erkannt. ? vorher trim() anwenden

Jetzt wird es etwas komplizierter: "ÄÖÜäöüß" (Zeichen außerhalb von ASCII-7bit) funktionieren in der Form nur dann korrekt, wenn das Encoding der Quellcode-Datei und das Encoding der Eingabedaten diese Zeichen binär identisch und in einem Byte kodieren. Da wir heute hoffentlich alle UTF-8 nutzen, muss da noch ein u-Pattern-Modifikator dran, da sich sonst mindestens kaputte Multibyte-Characters (Byte-Reihenfolge vertauscht) einschleusen lassen.
 
Zuletzt bearbeitet:
Also ich bin aktuell dabei endlich mal dieses RegEx zu verstehen...

Als Tool verwende ich diese Seite: http://txt2re.com/

Unter Punkt 1 gebe ich die unerwünschten Zeichen ein.

PHP:
<>=$[]{}#'´

Dann klick ich auf den Button und wähle die einzelnen Zeichen aus.

Dann erhalte ich folgendes.

PHP:
  $re1='(<)';	# Any Single Character 1
  $re2='(>)';	# Any Single Character 2
  $re3='(=)';	# Any Single Character 3
  $re4='(\\$)';	# Any Single Character 4
  $re5='(\\[)';	# Any Single Character 5
  $re6='(\\])';	# Any Single Character 6
  $re7='(\\{)';	# Any Single Character 7
  $re8='(\\})';	# Any Single Character 8
  $re9='(#)';	# Any Single Character 9
  $re10='(\')';	# Any Single Character 10
  $re11='(´)';	# Any Single Character 11

Warum sieht das denn so aus und nicht an einem Stück?
 
Ganz ehrlich. Ich habe mit dieser Seite jetzt mal ein wenig herum gespielt. Schön, aber wenn du verstehen willst was du da klicken solltest, dann kannst du grad so gut den Pattern von Hand ein. Zumal diese Seite nur Patterns mit erwünschten Zeichen in einer bestimmten Reihenfolge macht. Also absolut nicht das was du suchst. Vergiss diese Seite, sie nützt dir nix.
 
Ok... Schade.

Ich möchte diese Zeichen in einer Variable suchen und verbieten.

PHP:
<>=$[]{}#'´

Ich habe es mal so ausprobiert. Ob es richtig kann ich nicht wirklich beurteilen.

PHP:
   if (preg_match('^[\<\>\=\#\´\'\$\[\]\{\}]+$', $User_Var))
   {
       echo 'Alles juuut';
   }
       else
   {
       echo 'Nix is juuut';
   }

Wäre das so richtig?
 
Ja genau. Sobald einer dieser Zeichen vorkommt, ist der ganze String ungültig. Klappt nun mit deinem Code auch! :) Danke!

Ist nur eine Klammer zuviel im Code.
 
Zurück