Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reguläre Ausdrucke (PCRE)

Reguläre Ausdrucke (PCRE)

PHP Usergroup (D/DU/KR) Vortrag zum Thema Reguläre Ausdrücke am Beispiel der PCRE Bibliothek.

Dominik Siebel

February 24, 2010
Tweet

More Decks by Dominik Siebel

Other Decks in Programming

Transcript

  1. 24.02.2010 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
  2. 24.02.2010 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)
  3. 24.02.2010 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.
  4. 24.02.2010 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)
  5. 24.02.2010 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*
  6. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    9 Struktur Aufbau eines Reges /[a-z]+/im  Delimiter  Beliebiges Zeichen  Muss im Ausdruck escaped werden  '(' oder ')' in PCRE: ([a-z]+)im
  7. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    10 Struktur Aufbau eines Reges /[a-z]+/im  Delimiter  Beliebiges Zeichen  Muss im Ausdruck escaped werden  '(' oder ')' in PCRE: ([a-z]+)im  Ausdruck
  8. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    11 Struktur Aufbau eines Reges /[a-z]+/im  Delimiter  Beliebiges Zeichen  Muss im Ausdruck escaped werden  '(' oder ')' in PCRE: ([a-z]+)im  Ausdruck  Modifier
  9. 24.02.2010 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  \. \^ \$ \\ ...
  10. 24.02.2010 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
  11. 24.02.2010 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
  12. 24.02.2010 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]+/
  13. 24.02.2010 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
  14. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    19 Einfache Beispiele  Jedes beliebige Zeichen beliebig oft (auch kein- mal) /.*/
  15. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    20 Einfache Beispiele  Jedes beliebige Zeichen beliebig oft (auch kein- mal) /.*/
  16. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    22 Einfache Beispiele  Kleinbuchstaben von a bis z /[a-z]+/
  17. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    23 Einfache Beispiele /[a-z]+/  Kleinbuchstaben von a bis z  Ein- bis n-mal
  18. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    25 Einfache Beispiele  Alle Buchstaben von a bis z /[a-z]+/i
  19. 24.02.2010 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
  20. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    28 Einfache Beispiele /foo(\s*,\s*foo)*/  Zeichenkette foo
  21. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    29 Einfache Beispiele  Zeichenkette foo  0 bis n kommaseparierte Zeichenketten foo /foo(\s*,\s*foo)*/
  22. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    30 Einfache Beispiele  Zeichenkette foo  0 bis n kommaseparierte Zeichenketten foo /foo(\s*,\s*foo)*/
  23. 24.02.2010 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. 24.02.2010 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 .*
  25. 24.02.2010 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
  26. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    34 Greediness  Input: foobar  Match: alle Zeichen /.*/
  27. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    35 Greediness  Input: foobar  Match: kein Zeichen /.*/U /.*?/
  28. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    37 Subpattern Verwendung  Informationsextraktion  Nummeriert nach öffnenden Klammern: (1) foobar (2) bar (3) bar /(foo(bar))(baz)*/
  29. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    38 Subpattern Verwendung  Vervielfachung von Teilausdrücken durch Quantoren /(foobar)*/
  30. 24.02.2010 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)*/
  31. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    40 Subpattern Gruppierung  Gruppierung ohne die Erzeugung eines Subpattern durch ?:  Result: (1) foo | bar (2) foo | bar /(foo|bar)(?:baz)?(\1)*/
  32. 24.02.2010 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'  'lastname' => 'Siebel'  2 => 'Siebel' /(?P<firstname>[A-Za-z]+) (?P<lastname>[A-Za-z]+)/
  33. 24.02.2010 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
  34. 24.02.2010 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)/
  35. 24.02.2010 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)/
  36. 24.02.2010 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+/
  37. 24.02.2010 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/
  38. 24.02.2010 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>)/
  39. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    48 Bedingte Ausdrücke  <a> /(<a\s+[^>]+\s*)?<img\s+[^>]+>(?(\1)\s*</a>)/
  40. 24.02.2010 Dominik Siebel - Reguläre Ausdrücke & die PCRE- Bibliothek

    49 Bedingte Ausdrücke  <a>  <img> /(<a\s+[^>]+\s*)?<img\s+[^>]+>(?(\1)\s*</a>)/
  41. 24.02.2010 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>)/
  42. 24.02.2010 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>)/
  43. 24.02.2010 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
  44. 24.02.2010 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
  45. 24.02.2010 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  ...
  46. 24.02.2010 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
  47. 24.02.2010 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
  48. 24.02.2010 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)  ...
  49. 24.02.2010 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
  50. 24.02.2010 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
  51. 24.02.2010 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
  52. 24.02.2010 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
  53. 24.02.2010 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
  54. 24.02.2010 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