Reguläre Ausdrucke (PCRE)

Post on 05-Jul-2015

2.557 views 1 download

description

Understanding Regular Expressions

Transcript of Reguläre Ausdrucke (PCRE)

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!