reguläre ausdrucke (pcre)
Post on 05-Jul-2015
2.559 Views
Preview:
DESCRIPTION
TRANSCRIPT
Reguläre Ausdrücke& die PCRE- Bibliothek
Dominik SiebelPHP Usergroup D / DU / KR
Usergrouptreffen am 24.02.2010
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 2
Über mich
Dominik Siebel (25)
Fachinformatiker für Anwendungsentwicklung
PHP seit 2004
Webdeveloper TWT Interactive GmbH seit Juni 2008
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 3
Agenda
Definition & Theorie
Einstieg
Struktur und Funktionsweise
Metazeichen
Zeichenklassen
Quantoren
Einfache Beispiele
Fortgeschritten
Greediness
Subpattern
Assertions
Bedingte Ausdrücke
Zusatz
Regex in PHP
Dos und Don'ts (Rekursionen)
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 4
Definition & Theorie
In der Informatik ist ein regulärer Ausdruck (RegExp oder Regex) eine Zeichenkette, die der
Beschreibung von Mengen und Untermengen von Zeichenketten mit Hilfe bestimmter syntaktischer
Regeln dient.
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 5
Definition & Theorie
Beschreiben eine Familie von formalen Sprachen
Formale Grammatik vom Typ3 der Chomsky-Hierarchie
Zu jedem Regex existiert ein endlicher Automat
3 Operationen
Alternative (Boolean „or“)
Verkettung (Grouping)
Wiederholung (Quantification)
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 6
Funktionsweise
Zeichenweise Verarbeitung
immer von links nach rechts
Alle Metazeichen / Zeichenklassen werden als einfaches Zeichen gewertet
„Dumm und gierig“
Bestehen aus Zeichen des zugrunde liegenden Alphabets und definierten Metazeichen*
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 7
Struktur Aufbau eines Reges
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 8
Struktur Aufbau eines Reges
/[a-z]+/im
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 9
Struktur Aufbau eines Reges
/[a-z]+/imDelimiter
Beliebiges Zeichen
Muss im Ausdruck escaped werden
'(' oder ')' in PCRE: ([a-z]+)im
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 10
Struktur Aufbau eines Reges
/[a-z]+/imDelimiter
Beliebiges Zeichen
Muss im Ausdruck escaped werden
'(' oder ')' in PCRE: ([a-z]+)im
Ausdruck
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 11
Struktur Aufbau eines Reges
/[a-z]+/imDelimiter
Beliebiges Zeichen
Muss im Ausdruck escaped werden
'(' oder ')' in PCRE: ([a-z]+)im
Ausdruck
Modifier
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 12
Metazeichen
. beliebiges Zeichen
^ Anfang
$ Ende
| Alternative
(…) Subpattern
[…] Zeichenklassen
* + ? {n,m} Quantoren
\ Aufheben der Meta- Eigenschaften
\. \^ \$ \\ ...
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 13
Zeichenklassen Abgrenzung
Logische Gruppierung von Zeichen
[0-9] Zeichenauswahl
repräsentiert ein Zeichen der Auswahl
Kontextsensitiv
\d Zeichenklasse
Können durch Zeichenauswahl abgebildet werden
Negierung durch Großschreibung: \D
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 14
Zeichenklassen Beispiele
Zeichenauswahl
[abc] Buchstabe a,b oder c
[a-zA-Z0-9] alphanumerisches Zeichen
[^a-zA-Z0-9] alles außer einem alphanumerischen Zeichen
Vordefinierte Zeichenklassen
\d Dezimalzahl
\w Wortzeichen
\s Whitespace (Leerzeichen UND Steuerzeichen \t, \r, \n)
… und mehr: \h, \H, \v, \V
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 15
Quantoren
Vervielfachen des vorangegangenen Ausdrucks
Können auf jeden beliebigen Ausdruck angewendet werden:
Zeichen Zeichenklassen
Referenzen Subpattern
/[a-z]+/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 16
Quantoren Typen
? vor. Ausdruck optional {0,1}
+ vor. Ausdruck mindestens einmal {1,}
* vor. Ausdruck beliebig oft {0,}
{min,max}
{n} vor. Ausdruck exakt n-mal
{,max} vor. Ausdruck maximal max-mal
{min,} vor. Ausdruck mindestens min-mal
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 17
Einfache Beispiele
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 18
Einfache Beispiele
/.*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 19
Einfache Beispiele
Jedes beliebige Zeichen beliebig oft (auch kein-mal)
/.*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 20
Einfache Beispiele
Jedes beliebige Zeichen beliebig oft (auch kein-mal)
/.*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 21
Einfache Beispiele
/[a-z]+/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 22
Einfache Beispiele
Kleinbuchstaben von a bis z
/[a-z]+/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 23
Einfache Beispiele
/[a-z]+/
Kleinbuchstaben von a bis z
Ein- bis n-mal
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 24
Einfache Beispiele
/[a-z]+/i
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 25
Einfache Beispiele
Alle Buchstaben von a bis z
/[a-z]+/i
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 26
Einfache Beispiele
Alle Buchstaben von a bis z
ein- bis n-mal
/[a-z]+/i
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 27
Einfache Beispiele
/foo(\s*,\s*foo)*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 28
Einfache Beispiele
/foo(\s*,\s*foo)*/
Zeichenkette foo
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 29
Einfache Beispiele
Zeichenkette foo
0 bis n kommaseparierte Zeichenketten foo
/foo(\s*,\s*foo)*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 30
Einfache Beispiele
Zeichenkette foo
0 bis n kommaseparierte Zeichenketten foo
/foo(\s*,\s*foo)*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 31
Einfache Beispiele
Zeichenkette foo
0 bis n kommaseparierte Zeichenketten foo
Inklusive umgebender Whitespaces
/foo(\s*,\s*foo)*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 32
Greediness
Q: Auf wie viele Zeichen matcht der Reguläre Ausdruck für die Zeichenkette foobar
Alle?
Keins?
A: Abhängig von der „Gierigkeit“ (Greediness) der Regex- Engine
Greedy (default)
Ungreedy
.*
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 33
Greediness Umschalten
Global über Modifier U
/.*/U
Gilt für den gesamten Regulären Ausdruck
Lokal über Quantor gefolgt von ?
/.*?/
/[0-9]+?/
Gilt für den jeweils vorangestellten Teilausdruck
/.*?/U Kombination möglich
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 34
Greediness
Input: foobar
Match: alle Zeichen
/.*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 35
Greediness
Input: foobar
Match: kein Zeichen
/.*/U
/.*?/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 36
Subpattern
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 37
Subpattern Verwendung
Informationsextraktion
Nummeriert nach öffnenden Klammern:
foobar
bar
bar
/(foo(bar))(baz)*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 38
Subpattern Verwendung
Vervielfachung von Teilausdrücken durch Quantoren
/(foobar)*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 39
Subpattern Verwendung
Rückwärtsreferenzierung
Wiederverwendung von Subpattern
Nummeriert nach öffnender Klammer
/(foo|bar)something(\1)*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 40
Subpattern Gruppierung
Gruppierung ohne die Erzeugung eines Subpattern durch ?:
Result:
foo | bar
foo | bar
/(foo|bar)(?:baz)?(\1)*/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 41
Subpattern Benennung
Eigenart der PCRE
Mit ?P<key> lassen sich Subpattern zusätzlich assoziativ ablegen:
Input: Dominik Siebel
0 => 'Dominik Siebel'
'firstname' => 'Dominik'
1 => 'Dominik'
/(?P<firstname>[A-Za-z]+) (?P<lastname>[A-Za-z]+)/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 42
Assertions Definition
Annahme / Behauptung
Seit Perl 5
Ermöglichen kontextsensitive Bedingungen
Positive Assertions
Negative Assertions
Forward Assertions
Backward Assertions
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 43
Assertions positive forward
Positive look-ahead assertion
Definiert durch ?=
„Finde whitespace wenn gefolgt von EUR“
/\s(?=EUR)/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 44
Assertions negative forward
Negative look-ahead assertion
Definiert durch ?!
„Finde Sport wenn nicht gefolgt von verein“
/Sport(?!verein)/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 45
Assertions positive backward
Positive look-behind assertion
Definiert durch ?<=
„Finde Zahlen vorangestelltem EUR“
/(?<=EUR) \d+/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 46
Assertions negative backward
Negative look-behind assertion
Definiert durch ?<!
„Finde verein wenn Sport nicht vorausgegangen ist“
/(?<!Sport)verein/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 47
Bedingte Ausdrücke
„Wenn öffnendes a-Tag vorhanden muss das schließende auch gematcht werden“
Vergleichbar mit dem ternären Operator in PHP:
echo ( empty($aList) ? 'Liste leer' : '' );
Definiert durch ?(if) then | else
Nachfolgender Ausdruck wenn Bedingung erfüllt
/(<a\s+[^>]+\s*)?<img\s+[^>]+>(?(\1)\s*</a>)/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 48
Bedingte Ausdrücke
<a>
/(<a\s+[^>]+\s*)?<img\s+[^>]+>(?(\1)\s*</a>)/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 49
Bedingte Ausdrücke
<a>
<img>
/(<a\s+[^>]+\s*)?<img\s+[^>]+>(?(\1)\s*</a>)/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 50
Bedingte Ausdrücke
<a>
<img />
Bedingung: <a> muss vorhanden sein
„Wenn <a> - Tag gefunden, dann </a> suchen“
/(<a\s+[^>]+\s*)?<img\s+[^>]+>(?(\1)\s*</a>)/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 51
Bedingte Ausdrücke
<a>
<img />
Bedingung: <a> muss vorhanden sein
„Wenn <a> - Tag gefunden, dann </a> suchen“
/(<a\s+[^>]+\s*)?<img\s+[^>]+>(?(\1)\s*</a>)/
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 52
Reguläre Ausdrücke in PHP preg_*
preg_match(RegExp, Subject, [matches])
Subject einfach gegen RegExp prüfen
Optional: matches
Liefert 0 oder 1 (Anzahl der Treffer)
preg_replace(RegExp, Replacement, Subject)
Alle Treffer von RegExp in Subject durch Replacement ersetzen
Optional: Limit, Anzahl der Ersetzungen
Liefert Subject nach Ersetzungen
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 53
Reguläre Ausdrücke in PHP preg_*
preg_split(RegExp, Subject)
Subject anhand von RegExp aufteilen
Optional: Limit, Flags*
Liefert array der Teile
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 54
Reguläre Ausdrücke in PHP preg_*
preg_split(RegExp, Subject)
Subject anhand von RegExp aufteilen
Optional: Limit, Flags*
Liefert array der Teile
Flags
PREG_SPLIT_NO_EMPTY Leere Elemente werden ignoriert
...
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 55
Reguläre Ausdrücke in PHP preg_*
preg_split(RegExp, Subject)
Subject anhand von RegExp aufteilen
Optional: Limit, Flags*
Liefert array der Teile
preg_quote(Subject, [Delimiter])
Metazeichen in Subject escapen
Optional: Delimiter
Liefert Subject breinigt
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 56
Reguläre Ausdrücke in PHP preg_*
preg_match_all(RegExp, Subject, [Matches], [Flags])
Subject einfach gegen RegExp prüfen
Optional: Matches, Flags*, Offset
Liefert 0 oder Anzahl der Treffer
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 57
Reguläre Ausdrücke in PHP preg_*
preg_match_all(RegExp, Subject, [Matches], [Flags])
Subject einfach gegen RegExp prüfen
Optional: Matches, Flags*, Offset*
Liefert 0 oder Anzahl der Treffer
Flags
PREG_PATTERN_ORDER Sortierung nach Subpattern (default)
PREG_SET_ORDER Sortierung nach Gesamtausdruck (vgl. preg_match)
...
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 58
Reguläre Ausdrücke in PHP preg_*
preg_match_all(RegExp, Subject, [Matches], [Flags])
Subject einfach gegen RegExp prüfen
Optional: Matches, Flags*, Offset*
Liefert 0 oder Anzahl der Treffer
Manual: http://php.net/manual/en/ref.pcre.php
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 59
Reguläre Ausdrücke in PHP Escaping
Bestimmte Zeichen müssen escaped werden
Double quotes “
\$ Dollarzeichen
\\ Backslash
\“ double quote
Single quotes '
\\ Backslash
\' single quote
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 60
Reguläre Ausdrücke in PHP Escaping
Alle Metazeichen ! ? . + * () [] {}
Delimiter (Außer bei Verwendung von () )
Verwendung von Single Quotes ratsam
/[\\\\\\[\\]]*/Auch wenn nicht nötig: Backslash escapen
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 61
Dos und Don'ts
Do: Validierung von begrenztem input
Do: Tokenizing von Zeichenketten
Dont: Parsen mit Regulären Ausdrücken
Schwer wartbar
Fehlersuche fast unmöglich
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 62
Quellen
Reguläre Ausdrücke – kurz & gut, O'Reilly Verlag, ISBN: 3897215357
Wikipedia http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke
24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 63
Empfehlungen
Reguläre Ausdrücke – kurz & gut, O'Reilly Verlag, ISBN: 3897215357
Reguläre Ausdrücke, O'Reilly Verlag, ISBN: 3897217201
Reguläre Ausdrücke& die PCRE- Bibliothek
Vielen Dank für Eure Aufmerksamkeit!
top related