PHP – Reguläre Ausdrücke

Transcrição

PHP – Reguläre Ausdrücke
PHP – Reguläre Ausdrücke
Christian Gürtler
19. März 2012
Inhaltsverzeichnis
Inhaltsverzeichnis
1 Einleitung
1
2 Erkennung von Mustern
1
2.1
2.2
2.3
2.4
2.5
2.6
Wichtige Zeichen . . . .
Zeichenklassen . . . . .
Backslash . . . . . . . . .
eingebaute Funktionen .
Schreibweise . . . . . . .
lookahead / lookbehind
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1 Einleitung
Einleitung
• Eingaben in Webseiten sollten auf ihre Korrektheit geprüft werden.
• Namen: nur Buchstaben
• Kreditkartennummern
• email-Adressen
2 Erkennung von Mustern
2.1 Wichtige Zeichen
Wichtige Zeichen
ˆ
$
.
[. . . ]
|
(. . . )
?
∗
+
{x,y}
[ˆ Zeichenfolge ]
Anfang eines Strings
Ende eines Strings
beliebiges Zeichen
Gruppe von Zeichen
Alternative (oder)
Untermuster
0 oder 1 Zeichen, Muster . . .
0 oder beliebig viele Zeichen, Muster, . . .
1 oder beliebig viele Zeichen, Muster, . . .
Quantifizierer (mind. x, aber max. y)
negiert Zeichenfolge
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
2
2
2
2
3
2.2 Zeichenklassen
häufig verwendete Zeichenklassen
[[:alnum:]]
[[:alpha:]]
[[:lower:]]
[[:upper:]]
[[:digit:]]
alphanumerische Zeichen
alphabetische Zeichen
Kleinbuchstaben
Großbuchstaben
Dezimalziffern
2.3 Backslash
Bedeutung des Backslash
\n
\t
\.
\d
\D
\w
\W
Neue Zeile
Tabulator
ein Punkt
eine beliebige Ziffer (0 − 9)
alles außer Ziffern
ein Wort (Buchstabe, Ziffer, Unterstrich)
jedes Nicht-Wort-Zeichen
2.4 eingebaute Funktionen
eingebaute Funktionen
• preg_match sucht nach Muster
• preg_replace ersetzt Muster
2.5 Schreibweise
Schreibweise
• preg_match("/muster/", string)
• preg_replace("/muster/", ersatz, string)
• das Muster wird meist von zwei «/ »eingeschlossen
Beispiele
• preg_match("/^.{1,6}$/", $_POST["pass"])
der String darf vom Anfang bis zum Ende aus mind. 1, max. aber 6 beliebigen Zeichen
bestehen
• preg_match("/^[a-zA-Z\pL]+$/", $_POST["user"])
der String darf vom Anfang bis zum Ende nur aus Groß- und Kleinbuchstaben bestehen
(inkl. Umlaute und scharfes «s»)
• preg_replace('/,/','.',$eins)
es werden im String Beistriche durch einen «.»ersetzt.
2
Beispiel
Listing 1: Beispiel preg_replace
1
2
3
4
5
6
7
8
9
<?php
$datum = '2009−1−10';
$suchmuster = '/(\d{4})−(\d{1,2})−(\d{1,2})/';
$ersetzen = ' \3.\2.\1' ;
echo "neu: " ;
echo preg_replace($suchmuster, $ersetzen, $datum);
echo "\n";
echo " alt : $datum";
?>
2.6 lookahead / lookbehind
Listing 2: lookahead/lookbehind
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?PHP
/* pos. lookahead: a1(?= b1)
b1 muss auf a1 folgen
neg.
lookahead:
a1(?!
b1)
b1
darf nicht auf a1 folgen
*
pos.
lookbehind:
(?<=
b1)a1
b1
muss a1 vorausgehen
*
neg.
lookbehind:
(?<!
b1)a1
b1
darf
a1 nicht vorausgehen
*
/
*
echo "\n";
echo "positives lookahead (alle du vor einem ,)\n"; /* , muss auf du folgen*/
echo "−−−−−−−−−−−−−−−−−−−\n";
$string = "ene mene muh und raus bist du, raus bist du noch lange nicht";
echo "$string \n";
$muster = "/du(?=,)/";//alle du vor einem beistrich werden ersetzt
$ersatz = "DU";
$string = preg_replace($muster, $ersatz, $string );
echo $string ;echo "\n";
echo "\n";
echo "\n";
18
19
20
21
22
23
24
25
26
27
28
echo "positives lookbehind (wenn ba nach r, dann ba durch BA ersetzen)\n";
echo "−−−−−−−−−−−−−−−−−−−−\n";
$song = "ba ba ba ba barbara ann";
echo "$song\n";
$muster = "/(?<=r)ba/";//wenn r vor einem ba, dann ba durch BA ersetzen
$ersatz = "BA";
$song = preg_replace($muster, $ersatz, $song);
echo $song;echo "\n";
echo "\n";
echo "\n";
29
30
31
32
33
34
35
36
37
38
39
echo "negatives lookahead (alle ba, die nicht vor einem r stehen ersetzen)\n";
echo "−−−−−−−−−−−−−−−−−−−\n";
$song = "ba ba ba ba barbara ann";
echo "$song\n";
$muster = "/ba(?!r)/";//alle ba, die nicht vor einem r stehen ersetzen
$ersatz = "BA";
$song = preg_replace($muster, $ersatz, $song);
echo $song;echo "\n";
echo "\n";
echo "\n";
40
41
42
echo "negatives lookbehind (alle ba vor denen kein r steht ersetzen)\n";
echo "−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−\n";
3
43
44
45
46
47
48
49
$song = "ba ba ba ba barbara ann";
echo "$song\n";
$muster = "/(?<!r)ba/";//alle ba vor denen kein r steht werden ersetzt
$ersatz = "BA";
$song = preg_replace($muster, $ersatz, $song);
echo $song;echo "\n\n";
?>
4