64
Reguläre Ausdrücke & die PCRE- Bibliothek Dominik Siebel PHP Usergroup D / DU / KR Usergrouptreffen am 24.02.2010

Reguläre Ausdrucke (PCRE)

Embed Size (px)

DESCRIPTION

Understanding Regular Expressions

Citation preview

Page 1: Reguläre Ausdrucke (PCRE)

Reguläre Ausdrücke& die PCRE- Bibliothek

Dominik SiebelPHP Usergroup D / DU / KR

Usergrouptreffen am 24.02.2010

Page 2: Reguläre Ausdrucke (PCRE)

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

Page 3: Reguläre Ausdrucke (PCRE)

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)

Page 4: Reguläre Ausdrucke (PCRE)

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.

Page 5: Reguläre Ausdrucke (PCRE)

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)

Page 6: Reguläre Ausdrucke (PCRE)

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*

Page 7: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 7

Struktur Aufbau eines Reges

Page 8: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 8

Struktur Aufbau eines Reges

/[a-z]+/im

Page 9: Reguläre Ausdrucke (PCRE)

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

Page 10: Reguläre Ausdrucke (PCRE)

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

Page 11: Reguläre Ausdrucke (PCRE)

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

Page 12: Reguläre Ausdrucke (PCRE)

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

\. \^ \$ \\ ...

Page 13: Reguläre Ausdrucke (PCRE)

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

Page 14: Reguläre Ausdrucke (PCRE)

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

Page 15: Reguläre Ausdrucke (PCRE)

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]+/

Page 16: Reguläre Ausdrucke (PCRE)

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

Page 17: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 17

Einfache Beispiele

Page 18: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 18

Einfache Beispiele

/.*/

Page 19: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 19

Einfache Beispiele

Jedes beliebige Zeichen beliebig oft (auch kein-mal)

/.*/

Page 20: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 20

Einfache Beispiele

Jedes beliebige Zeichen beliebig oft (auch kein-mal)

/.*/

Page 21: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 21

Einfache Beispiele

/[a-z]+/

Page 22: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 22

Einfache Beispiele

Kleinbuchstaben von a bis z

/[a-z]+/

Page 23: Reguläre Ausdrucke (PCRE)

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

Page 24: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 24

Einfache Beispiele

/[a-z]+/i

Page 25: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 25

Einfache Beispiele

Alle Buchstaben von a bis z

/[a-z]+/i

Page 26: Reguläre Ausdrucke (PCRE)

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

Page 27: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 27

Einfache Beispiele

/foo(\s*,\s*foo)*/

Page 28: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 28

Einfache Beispiele

/foo(\s*,\s*foo)*/

Zeichenkette foo

Page 29: Reguläre Ausdrucke (PCRE)

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)*/

Page 30: Reguläre Ausdrucke (PCRE)

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)*/

Page 31: Reguläre Ausdrucke (PCRE)

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)*/

Page 32: Reguläre Ausdrucke (PCRE)

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

.*

Page 33: Reguläre Ausdrucke (PCRE)

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

Page 34: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 34

Greediness

Input: foobar

Match: alle Zeichen

/.*/

Page 35: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 35

Greediness

Input: foobar

Match: kein Zeichen

/.*/U

/.*?/

Page 36: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 36

Subpattern

Page 37: Reguläre Ausdrucke (PCRE)

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)*/

Page 38: Reguläre Ausdrucke (PCRE)

24.02.10 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek 38

Subpattern Verwendung

Vervielfachung von Teilausdrücken durch Quantoren

/(foobar)*/

Page 39: Reguläre Ausdrucke (PCRE)

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)*/

Page 40: Reguläre Ausdrucke (PCRE)

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)*/

Page 41: Reguläre Ausdrucke (PCRE)

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]+)/

Page 42: Reguläre Ausdrucke (PCRE)

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

Page 43: Reguläre Ausdrucke (PCRE)

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)/

Page 44: Reguläre Ausdrucke (PCRE)

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)/

Page 45: Reguläre Ausdrucke (PCRE)

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+/

Page 46: Reguläre Ausdrucke (PCRE)

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/

Page 47: Reguläre Ausdrucke (PCRE)

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>)/

Page 48: Reguläre Ausdrucke (PCRE)

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>)/

Page 49: Reguläre Ausdrucke (PCRE)

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>)/

Page 50: Reguläre Ausdrucke (PCRE)

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>)/

Page 51: Reguläre Ausdrucke (PCRE)

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>)/

Page 52: Reguläre Ausdrucke (PCRE)

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

Page 53: Reguläre Ausdrucke (PCRE)

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

Page 54: Reguläre Ausdrucke (PCRE)

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

...

Page 55: Reguläre Ausdrucke (PCRE)

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

Page 56: Reguläre Ausdrucke (PCRE)

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

Page 57: Reguläre Ausdrucke (PCRE)

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)

...

Page 58: Reguläre Ausdrucke (PCRE)

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

Page 59: Reguläre Ausdrucke (PCRE)

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

Page 60: Reguläre Ausdrucke (PCRE)

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

Page 61: Reguläre Ausdrucke (PCRE)

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

Page 62: Reguläre Ausdrucke (PCRE)

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

Page 63: Reguläre Ausdrucke (PCRE)

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

Page 64: Reguläre Ausdrucke (PCRE)

Reguläre Ausdrücke& die PCRE- Bibliothek

Vielen Dank für Eure Aufmerksamkeit!