Reguläre Ausdrücke & die PCRE- Bibliothek Dominik Siebel PHP Usergroup D / DU / KR Usergrouptreffen am 24.02.2010
Über mich Dominik Siebel  (25) <ul><ul><li>Fachinformatiker für Anwendungsentwicklung
PHP seit 2004
Webdeveloper TWT Interactive GmbH seit Juni 2008 </li></ul></ul>
Agenda <ul><li>Definition & Theorie
Einstieg </li></ul><ul><ul><li>Struktur und Funktionsweise
Metazeichen
Zeichenklassen
Quantoren
Einfache Beispiele </li></ul></ul><ul><li>Fortgeschritten </li></ul><ul><ul><li>Greediness
Subpattern
Assertions
Bedingte Ausdrücke </li></ul></ul><ul><li>Zusatz </li></ul><ul><ul><li>Regex in PHP </li></ul></ul><ul><ul><li>Dos und Don...
Definition & Theorie In der Informatik ist ein  regulärer Ausdruck  (RegExp oder Regex) eine Zeichenkette, die der Beschre...
Definition & Theorie <ul><li>Beschreiben eine Familie von formalen Sprachen
Formale Grammatik vom Typ3 der Chomsky-Hierarchie
Zu jedem Regex existiert ein endlicher Automat
3 Operationen </li><ul><li>Alternative (Boolean „or“)
Verkettung (Grouping)
Wiederholung (Quantification) </li></ul></ul>
Funktionsweise <ul><li>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 * </li></ul>
Struktur  Aufbau eines Reges
Struktur  Aufbau eines Reges <ul>/ [a-z]+ /im </ul>
Struktur  Aufbau eines Reges <ul>/ [a-z]+ / im <ul><li>Delimiter </li><ul><li>Beliebiges Zeichen
Muss im  Ausdruck  escaped werden
'(' oder ')' in PCRE:  ( [a-z]+ ) im </li></ul></ul></ul>
Struktur  Aufbau eines Reges <ul>/ [a-z]+ /im <ul><li>Delimiter </li><ul><li>Beliebiges Zeichen
Muss im Ausdruck escaped werden
'(' oder ')' in PCRE:  ( [a-z]+ )im </li></ul><li>Ausdruck </li></ul></ul>
Struktur  Aufbau eines Reges <ul>/ [a-z]+ / im <ul><li>Delimiter </li><ul><li>Beliebiges Zeichen
Muss im Ausdruck escaped werden
'(' oder ')' in PCRE:  ( [a-z]+ )im </li></ul><li>Ausdruck
Modifier </li></ul></ul>
Metazeichen <ul><li>. beliebiges Zeichen
^ Anfang
$ Ende
| Alternative
( … ) Subpattern
[ … ] Zeichenklassen
*  +  ?  { n,m } Quantoren
 Aufheben der Meta- Eigenschaften </li><ul><li>.  ^  $   ... </li></ul></ul>
Zeichenklassen  Abgrenzung <ul><li>Logische Gruppierung von Zeichen
[0-9] Zeichenauswahl </li><ul><li>repräsentiert ein Zeichen der Auswahl
Kontextsensitiv </li></ul><li>d Zeichenklasse </li><ul><li>Können durch Zeichenauswahl abgebildet werden
Negierung durch Großschreibung:  D   </li></ul></ul>
Zeichenklassen  Beispiele <ul><li>Zeichenauswahl </li><ul><li>[abc] Buchstabe a,b oder c
[a-zA-Z0-9] alphanumerisches Zeichen
[^a-zA-Z0-9] alles außer einem alphanumerischen Zeichen </li></ul><li>Vordefinierte Zeichenklassen </li><ul><li>d Dezimalz...
w Wortzeichen
s Whitespace  (Leerzeichen UND Steuerzeichen 	, 
, 
)
… und mehr: h, H, v, V </li></ul></ul>
Quantoren <ul><li>Vervielfachen  des  vorangegangenen Ausdrucks
Können auf jeden beliebigen Ausdruck angewendet werden: </li><ul><li>Zeichen Zeichenklassen
Referenzen Subpattern </li></ul></ul>/ [a-z] + /
Quantoren  Typen <ul><li>? vor. Ausdruck optional   {0,1}
+ vor. Ausdruck mindestens einmal  {1,}
* vor. Ausdruck beliebig oft  {0,}
{ min , max }   </li><ul><li>{ n } vor. Ausdruck exakt  n -mal
{, max } vor. Ausdruck maximal  max -mal
{ min ,} vor. Ausdruck mindestens  min -mal </li></ul></ul>
Nächste SlideShare
Wird geladen in …5
×

Reguläre Ausdrucke (PCRE)

3.147 Aufrufe

Veröffentlicht am

Understanding Regular Expressions

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

Reguläre Ausdrucke (PCRE)

  1. 1. Reguläre Ausdrücke & die PCRE- Bibliothek Dominik Siebel PHP Usergroup D / DU / KR Usergrouptreffen am 24.02.2010
  2. 2. Über mich Dominik Siebel (25) <ul><ul><li>Fachinformatiker für Anwendungsentwicklung
  3. 3. PHP seit 2004
  4. 4. Webdeveloper TWT Interactive GmbH seit Juni 2008 </li></ul></ul>
  5. 5. Agenda <ul><li>Definition & Theorie
  6. 6. Einstieg </li></ul><ul><ul><li>Struktur und Funktionsweise
  7. 7. Metazeichen
  8. 8. Zeichenklassen
  9. 9. Quantoren
  10. 10. Einfache Beispiele </li></ul></ul><ul><li>Fortgeschritten </li></ul><ul><ul><li>Greediness
  11. 11. Subpattern
  12. 12. Assertions
  13. 13. Bedingte Ausdrücke </li></ul></ul><ul><li>Zusatz </li></ul><ul><ul><li>Regex in PHP </li></ul></ul><ul><ul><li>Dos und Don'ts (Rekursionen) </li></ul></ul>
  14. 14. 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.
  15. 15. Definition & Theorie <ul><li>Beschreiben eine Familie von formalen Sprachen
  16. 16. Formale Grammatik vom Typ3 der Chomsky-Hierarchie
  17. 17. Zu jedem Regex existiert ein endlicher Automat
  18. 18. 3 Operationen </li><ul><li>Alternative (Boolean „or“)
  19. 19. Verkettung (Grouping)
  20. 20. Wiederholung (Quantification) </li></ul></ul>
  21. 21. Funktionsweise <ul><li>Zeichenweise Verarbeitung
  22. 22. immer von links nach rechts
  23. 23. Alle Metazeichen / Zeichenklassen werden als einfaches Zeichen gewertet
  24. 24. „Dumm und gierig“
  25. 25. Bestehen aus Zeichen des zugrunde liegenden Alphabets und definierten Metazeichen * </li></ul>
  26. 26. Struktur Aufbau eines Reges
  27. 27. Struktur Aufbau eines Reges <ul>/ [a-z]+ /im </ul>
  28. 28. Struktur Aufbau eines Reges <ul>/ [a-z]+ / im <ul><li>Delimiter </li><ul><li>Beliebiges Zeichen
  29. 29. Muss im Ausdruck escaped werden
  30. 30. '(' oder ')' in PCRE: ( [a-z]+ ) im </li></ul></ul></ul>
  31. 31. Struktur Aufbau eines Reges <ul>/ [a-z]+ /im <ul><li>Delimiter </li><ul><li>Beliebiges Zeichen
  32. 32. Muss im Ausdruck escaped werden
  33. 33. '(' oder ')' in PCRE: ( [a-z]+ )im </li></ul><li>Ausdruck </li></ul></ul>
  34. 34. Struktur Aufbau eines Reges <ul>/ [a-z]+ / im <ul><li>Delimiter </li><ul><li>Beliebiges Zeichen
  35. 35. Muss im Ausdruck escaped werden
  36. 36. '(' oder ')' in PCRE: ( [a-z]+ )im </li></ul><li>Ausdruck
  37. 37. Modifier </li></ul></ul>
  38. 38. Metazeichen <ul><li>. beliebiges Zeichen
  39. 39. ^ Anfang
  40. 40. $ Ende
  41. 41. | Alternative
  42. 42. ( … ) Subpattern
  43. 43. [ … ] Zeichenklassen
  44. 44. * + ? { n,m } Quantoren
  45. 45. Aufheben der Meta- Eigenschaften </li><ul><li>. ^ $ ... </li></ul></ul>
  46. 46. Zeichenklassen Abgrenzung <ul><li>Logische Gruppierung von Zeichen
  47. 47. [0-9] Zeichenauswahl </li><ul><li>repräsentiert ein Zeichen der Auswahl
  48. 48. Kontextsensitiv </li></ul><li>d Zeichenklasse </li><ul><li>Können durch Zeichenauswahl abgebildet werden
  49. 49. Negierung durch Großschreibung: D </li></ul></ul>
  50. 50. Zeichenklassen Beispiele <ul><li>Zeichenauswahl </li><ul><li>[abc] Buchstabe a,b oder c
  51. 51. [a-zA-Z0-9] alphanumerisches Zeichen
  52. 52. [^a-zA-Z0-9] alles außer einem alphanumerischen Zeichen </li></ul><li>Vordefinierte Zeichenklassen </li><ul><li>d Dezimalzahl
  53. 53. w Wortzeichen
  54. 54. s Whitespace (Leerzeichen UND Steuerzeichen , , )
  55. 55. … und mehr: h, H, v, V </li></ul></ul>
  56. 56. Quantoren <ul><li>Vervielfachen des vorangegangenen Ausdrucks
  57. 57. Können auf jeden beliebigen Ausdruck angewendet werden: </li><ul><li>Zeichen Zeichenklassen
  58. 58. Referenzen Subpattern </li></ul></ul>/ [a-z] + /
  59. 59. Quantoren Typen <ul><li>? vor. Ausdruck optional {0,1}
  60. 60. + vor. Ausdruck mindestens einmal {1,}
  61. 61. * vor. Ausdruck beliebig oft {0,}
  62. 62. { min , max } </li><ul><li>{ n } vor. Ausdruck exakt n -mal
  63. 63. {, max } vor. Ausdruck maximal max -mal
  64. 64. { min ,} vor. Ausdruck mindestens min -mal </li></ul></ul>
  65. 65. Einfache Beispiele
  66. 66. Einfache Beispiele / .* /
  67. 67. Einfache Beispiele <ul><li>Jedes beliebige Zeichen beliebig oft (auch kein -mal) </li></ul>/ . * /
  68. 68. Einfache Beispiele <ul><li>Jedes beliebige Zeichen beliebig oft (auch kein -mal) </li></ul>/ . * /
  69. 69. Einfache Beispiele / [a-z]+ /
  70. 70. Einfache Beispiele <ul><li>Kleinbuchstaben von a bis z </li></ul>/ [a-z] + /
  71. 71. Einfache Beispiele / [a-z] + / <ul><li>Kleinbuchstaben von a bis z
  72. 72. Ein - bis n -mal </li></ul>
  73. 73. Einfache Beispiele / [a-z]+ / i
  74. 74. Einfache Beispiele <ul><li>Alle Buchstaben von a bis z </li></ul>/ [a-z] + / i
  75. 75. Einfache Beispiele <ul><li>Alle Buchstaben von a bis z
  76. 76. ein - bis n -mal </li></ul>/ [a-z] + / i
  77. 77. Einfache Beispiele / foo(s*,s*foo)* /
  78. 78. Einfache Beispiele / foo (s*,s*foo)* / <ul><li>Zeichenkette foo </li></ul>
  79. 79. Einfache Beispiele <ul><li>Zeichenkette foo
  80. 80. 0 bis n komma separierte Zeichenketten foo </li></ul>/ foo(s*,s*foo) * /
  81. 81. Einfache Beispiele <ul><li>Zeichenkette foo
  82. 82. 0 bis n komma separierte Zeichenketten foo </li></ul>/ foo(s* , s* foo )* /
  83. 83. Einfache Beispiele <ul><li>Zeichenkette foo
  84. 84. 0 bis n komma separierte Zeichenketten foo </li><ul><li>Inklusive umgebender Whitespaces </li></ul></ul>/ foo( s* , s* foo)* /
  85. 85. Greediness <ul><li>Q: Auf wie viele Zeichen matcht der Reguläre Ausdruck für die Zeichenkette foobar </li><ul><li>Alle?
  86. 86. Keins? </li></ul><li>A: Abhängig von der „ Gierigkeit “ ( Greediness ) der Regex- Engine </li><ul><li>Greedy (default)
  87. 87. Ungreedy </li></ul></ul>.*
  88. 88. Greediness Umschalten <ul><li>Global über Modifier U </li><ul><li>/ .* / U
  89. 89. Gilt für den gesamten Regulären Ausdruck </li></ul><li>Lokal über Quantor gefolgt von ? </li><ul><li>/ .* ? /
  90. 90. / [0-9]+ ? /
  91. 91. Gilt für den jeweils vorangestellten Teilausdruck </li></ul><li>/ .* ? / U Kombination möglich </li></ul>
  92. 92. Greediness <ul><li>Input: foobar
  93. 93. Match: alle Zeichen </li></ul>/ .* /
  94. 94. Greediness <ul><li>Input: foobar
  95. 95. Match: kein Zeichen </li></ul>/ .* / U / .* ? /
  96. 96. Subpattern
  97. 97. Subpattern Verwendung <ul><li>Informationsextraktion </li><ul><li>Nummeriert nach öffnenden Klammern: </li></ul></ul><ul><ul><ul><li>foobar
  98. 98. bar
  99. 99. bar </li></ul></ul></ul>/ ( foo ( bar ))( baz ) * /
  100. 100. Subpattern Verwendung <ul><li>Vervielfachung von Teilausdrücken durch Quantoren </li></ul>/ ( foobar )* /
  101. 101. Subpattern Verwendung <ul><li>Rückwärtsreferenzierung </li><ul><li>Wiederverwendung von Subpattern
  102. 102. Nummeriert nach öffnender Klammer </li></ul></ul>/ ( foo|bar ) something (1) * /
  103. 103. Subpattern Gruppierung <ul><li>Gruppierung ohne die Erzeugung eines Subpattern durch ?: </li><ul><li>Result: </li></ul></ul><ul><ul><ul><li>foo | bar
  104. 104. foo | bar </li></ul></ul></ul>/ (foo|bar) (?: baz ) ?(1)* /
  105. 105. Subpattern Benennung <ul><li>Eigenart der PCRE
  106. 106. Mit ?P<key> lassen sich Subpattern zusätzlich assoziativ ablegen: </li></ul>Input: Dominik Siebel <ul><ul><li>0 => 'Dominik Siebel'
  107. 107. 'firstname' => 'Dominik'
  108. 108. 1 => 'Dominik'
  109. 109. 'lastname' => 'Siebel'
  110. 110. 2 => 'Siebel' </li></ul></ul>/ ( ?P<firstname> [A-Za-z]+) ( ?P<lastname> [A-Za-z]+) /
  111. 111. Assertions Definition <ul><li>Annahme / Behauptung
  112. 112. Seit Perl 5
  113. 113. Ermöglichen kontextsensitive Bedingungen </li><ul><li>Positive Assertions
  114. 114. Negative Assertions
  115. 115. Forward Assertions
  116. 116. Backward Assertions </li></ul></ul>
  117. 117. Assertions positive forward <ul><li>Positive look-ahead assertion
  118. 118. Definiert durch ?=
  119. 119. „ Finde whitespace wenn gefolgt von EUR “ </li></ul>/ s( ?= EUR) /
  120. 120. Assertions negative forward <ul><li>Negative look-ahead assertion
  121. 121. Definiert durch ?!
  122. 122. „ Finde Sport wenn nicht gefolgt von verein “ </li></ul>/ Sport( ?! verein) /
  123. 123. Assertions positive backward <ul><li>Positive look-behind assertion
  124. 124. Definiert durch ?<=
  125. 125. „ Finde Zahlen vorangestelltem EUR “ </li></ul>/ ( ?<= EUR) d+ /
  126. 126. Assertions negative backward <ul><li>Negative look-behind assertion
  127. 127. Definiert durch ?<!
  128. 128. „ Finde verein wenn Sport nicht vorausgegangen ist“ </li></ul>/ ( ?<! Sport)verein /
  129. 129. Bedingte Ausdrücke <ul><li>„ Wenn öffnendes a-Tag vorhanden muss das schließende auch gematcht werden “
  130. 130. Vergleichbar mit dem ternären Operator in PHP: </li><ul><li>echo ( empty ( $aList ) ? 'Liste leer' : '' ); </li></ul><li>Definiert durch ?( if ) then | else
  131. 131. Nachfolgender Ausdruck wenn Bedingung erfüllt </li></ul>/ (<as+[^>]+s*)?<imgs+[^>]+>( ?(1) s*</a>) /
  132. 132. Bedingte Ausdrücke <ul><li><a> </li></ul>/ (<as+[^>]+s*)? <imgs+[^>]+>(?(1)s*</a>) /
  133. 133. Bedingte Ausdrücke <ul><li><a>
  134. 134. <img> </li></ul>/ (<as+[^>]+s*)? <imgs+[^>]+> (?(1)s*</a>) /
  135. 135. Bedingte Ausdrücke <ul><li><a>
  136. 136. <img />
  137. 137. Bedingung: <a> muss vorhanden sein </li><ul><li>„ Wenn <a> - Tag gefunden, dann </a> suchen“ </li></ul></ul>/ (<as+[^>]+s*)?<imgs+[^>]+>( ?(1) s*</a>) /
  138. 138. Bedingte Ausdrücke <ul><li><a>
  139. 139. <img />
  140. 140. Bedingung: <a> muss vorhanden sein </li><ul><li>„ Wenn <a> - Tag gefunden, dann </a> suchen“ </li></ul></ul>/ (<as+[^>]+s*)?<imgs+[^>]+>(?(1) s*</a> ) /
  141. 141. Reguläre Ausdrücke in PHP preg_* <ul><li>preg_match( RegExp , Subject , [ matches ]) </li><ul><li>Subject einfach gegen RegExp prüfen
  142. 142. Optional: matches
  143. 143. Liefert 0 oder 1 (Anzahl der Treffer) </li></ul><li>preg_replace( RegExp , Replacement , Subject ) </li><ul><li>Alle Treffer von RegExp in Subject durch Replacement ersetzen
  144. 144. Optional: Limit, Anzahl der Ersetzungen
  145. 145. Liefert Subject nach Ersetzungen </li></ul></ul>
  146. 146. Reguläre Ausdrücke in PHP preg_* <ul><li>preg_split( RegExp , Subject ) </li><ul><li>Subject anhand von RegExp aufteilen
  147. 147. Optional: Limit, Flags *
  148. 148. Liefert array der Teile </li></ul></ul>
  149. 149. Reguläre Ausdrücke in PHP preg_* <ul><li>preg_split( RegExp , Subject ) </li><ul><li>Subject anhand von RegExp aufteilen
  150. 150. Optional: Limit, Flags *
  151. 151. Liefert array der Teile </li></ul><li>Flags </li><ul><ul><li>PREG_SPLIT_NO_EMPTY Leere Elemente werden ignoriert
  152. 152. ... </li></ul></ul></ul>
  153. 153. Reguläre Ausdrücke in PHP preg_* <ul><li>preg_split( RegExp , Subject ) </li><ul><li>Subject anhand von RegExp aufteilen
  154. 154. Optional: Limit, Flags *
  155. 155. Liefert array der Teile </li></ul><li>preg_quote( Subject , [ Delimiter ]) </li><ul><li>Metazeichen in Subject escapen
  156. 156. Optional: Delimiter
  157. 157. Liefert Subject breinigt </li></ul></ul>
  158. 158. Reguläre Ausdrücke in PHP preg_* <ul><li>preg_match_all( RegExp , Subject , [ Matches ], [ Flags ]) </li><ul><li>Subject einfach gegen RegExp prüfen
  159. 159. Optional: Matches, Flags * , Offset
  160. 160. Liefert 0 oder Anzahl der Treffer </li></ul></ul>
  161. 161. Reguläre Ausdrücke in PHP preg_* <ul><li>preg_match_all( RegExp , Subject , [ Matches ], [ Flags ]) </li><ul><li>Subject einfach gegen RegExp prüfen
  162. 162. Optional: M atches, Flags * , Offset *
  163. 163. Liefert 0 oder Anzahl der Treffer
  164. 164. Flags </li><ul><li>PREG_PATTERN_ORDER Sortierung nach Subpattern (default)
  165. 165. PREG_SET_ORDER Sortierung nach Gesamtausdruck (vgl. preg_match)
  166. 166. ... </li></ul></ul></ul>
  167. 167. Reguläre Ausdrücke in PHP preg_* <ul><li>preg_match_all( RegExp , Subject , [ Matches ], [ Flags ]) </li><ul><li>Subject einfach gegen RegExp prüfen
  168. 168. Optional: M atches, Flags * , Offset *
  169. 169. Liefert 0 oder Anzahl der Treffer </li></ul><li>Manual: http://php.net/manual/en/ref.pcre.php </li></ul>
  170. 170. Reguläre Ausdrücke in PHP Escaping <ul><li>Bestimmte Zeichen müssen escaped werden
  171. 171. Double quotes “ </li><ul><li>$ Dollarzeichen
  172. 172. Backslash
  173. 173. “ double quote </li></ul><li>Single quotes ' </li><ul><li>Backslash
  174. 174. ' single quote </li></ul></ul>
  175. 175. Reguläre Ausdrücke in PHP Escaping <ul><li>Alle Metazeichen ! ? . + * () [] {}
  176. 176. Delimiter (Außer bei Verwendung von () )
  177. 177. Verwendung von Single Quotes ratsam </li></ul>/ [ [ ] ]* / <ul>Auch wenn nicht nötig: Backslash escapen </ul>
  178. 178. Dos und Don'ts <ul><li>Do : Validierung von begrenztem input
  179. 179. Do : Tokenizing von Zeichenketten
  180. 180. Dont : Parsen mit Regulären Ausdrücken </li><ul><li>Schwer wartbar
  181. 181. Fehlersuche fast unmöglich </li></ul></ul>
  182. 182. Quellen <ul><li>Reguläre Ausdrücke – kurz & gut, O'Reilly Verlag, ISBN: 3897215357
  183. 183. Wikipedia http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke </li></ul>
  184. 184. Empfehlungen <ul><li>Reguläre Ausdrücke – kurz & gut, O'Reilly Verlag, ISBN: 3897215357
  185. 185. Reguläre Ausdrücke, O'Reilly Verlag, ISBN: 3897217201 </li></ul>
  186. 186. Reguläre Ausdrücke & die PCRE- Bibliothek Vielen Dank für Eure Aufmerksamkeit!

×