Save 37% off PRO during our Black Friday Sale! »

Wyrażenia regularne

Wyrażenia regularne

2013-05-20 PHPers.pl

D608d2629d4e5b521f60cfbd3e9a9d73?s=128

Tytus

May 20, 2013
Tweet

Transcript

  1. Wyrażenia Regularne 20-05-2013 Tytus Ciunelis @tciunelis

  2. None
  3. Wyrażenia Regularne z

  4. Wyrażenia Regularne z Kapitanem Kirkiem

  5. PCRE PCRE = Perl Compatible Regular Expressions

  6. PCRE PCRE = Perl Compatible Regular Expressions Philip Hazel University

    Computing Service Cambridge CB2 3QH, England.
  7. PCRE PCRE = Perl Compatible Regular Expressions ◦ http://www.pcre.org/pcre.txt

  8. Oznaczenia RegExp Subject Match

  9. RegExp

  10. RegExp /foobar/i

  11. RegExp - pattern /foobar/i

  12. RegExp - pattern /foobar/i ◦ Pattern - sekwencja symboli i

    słów ◦ Opis szukanego łańcucha
  13. RegExp - modifier /foobar/i

  14. RegExp - modifier /foobar/i ◦ Opcjonalnie

  15. RegExp - delimiter /foobar/i

  16. RegExp - delimiter /foobar/i ◦ oddziela wzorzec ◦ rozdziela wzorzec

    od modyfikatorów
  17. RegExp - delimiter #foobar#i

  18. RegExp - delimiter #foobar#i

  19. RegExp - delimiter [foobar]i

  20. RegExp - delimiter {foobar}i

  21. RegExp - example /DESTRUCTION/ Peace or...UTTER DESTRUCTION...it's up to you.

    -- Kirk in 'A Taste Of Armageddon'
  22. RegExp - example /DESTRUCTION/ Peace or...UTTER DESTRUCTION...it's up to you.

    ◦ Wzorzec musi wystąpić przynajmniej raz ◦ Położenie nie jest istotne -- Kirk in 'A Taste Of Armageddon'
  23. Metacharacters

  24. Metacharacters /[Cap]tin \s* Ki+r./ ◦ Część znaków wzorca ma specjalne

    znaczenie
  25. /Captin .irk/ Metacharacters - Dot

  26. /Captin .irk/ Metacharacters - Dot ◦ Kropka pasuje do dowolnego

    znaku
  27. /Captin .irk/ Metacharacters - Dot ◦ Kropka pasuje do dowolnego

    znaku ◦ Oprócz znaku nowej lini
  28. /Captin .irk/ Metacharacters - Dot ◦ Kropka pasuje do dowolnego

    znaku ◦ Oprócz znaku nowej lini Captin Kirk ✓
  29. /Captin .irk/ Metacharacters - Dot ◦ Kropka pasuje do dowolnego

    znaku ◦ Oprócz znaku nowej lini Captin Dirk ✓
  30. /Captin .irk/ Metacharacters - Dot ◦ Kropka pasuje do dowolnego

    znaku ◦ Oprócz znaku nowej lini Captin Śirk ✓
  31. /Captin .irk/ Metacharacters - Dot ◦ Kropka pasuje do dowolnego

    znaku ◦ Oprócz znaku nowej lini Captin _irk ✓
  32. /Captin.Kirk/s Metacharacters - Dot

  33. /Captin.Kirk/s Metacharacters - Dot ◦ Modyfikator s włącza tryb single

    line (dotall)
  34. /Captin.Kirk/s Metacharacters - Dot ◦ Modyfikator s włącza tryb single

    line (dotall) Captin Kirk ✓
  35. /Captin.Kirk/s Metacharacters - Dot ◦ Modyfikator s włącza tryb single

    line (dotall) Captin:Kirk ✓
  36. /Captin.Kirk/s Metacharacters - Dot ◦ Modyfikator s włącza tryb single

    line (dotall) Captin↵ Kirk ✓
  37. /Captin.Kirk/s Metacharacters - Dot ◦ Modyfikator s włącza tryb single

    line (dotall) ◦ http://nikic.github.io/2011/12/10/PCRE-and-newlines.html Captin↵ Kirk ✓
  38. \$ Metacharacters - Escape ◦ Za pomocą \ można pozbawić

    znak specjalnego znaczenia
  39. \$ Metacharacters - Escape . [] () ^ $ *

    + ? {} | \ ◦ Za pomocą \ można pozbawić znak specjalnego znaczenia
  40. Price is \Q$9.99\E Metacharacters - Escape Price is $9.99

  41. Price is \Q$9.99\E Metacharacters - Escape Price is $9.99 ◦

    Metaznaki wewnątrz \Q i \E stracą swoje specjalne znaczenie
  42. Character Classes

  43. /[abcdef]/ Character Classes

  44. /[abcdef]/ Character Classes ◦ Brak separatorów między znakami

  45. /[abcdef]/ Character Classes ◦ Brak separatorów między znakami ◦ Ograniczone

    nawiasami kawadratowymi
  46. /[abcdef]/ Character Classes ◦ Brak separatorów między znakami ◦ Ograniczone

    nawiasami kawadratowymi ◦ Traktowane jako jeden znak
  47. /[a-f]/ Character Classes ◦ Można definiować zakres

  48. /[a-cd-f0-9]/ Character Classes ◦ Można definiować zakres ◦ Jedna klasa

    może zawierać wiele zakresów
  49. /[abc.]/ Character Classes ◦ Znaki specjalne (metacharacters) tracą swoje specjalne

    znaczenie wewnątrz klasy
  50. /[af-]/ Character Classes ◦ Myślnik traci specjalne znaczenie

  51. /[^abc]/ Character Classes ◦ Znaki w klasie mogą być zanegowane.

    Dopełnienie zbioru.
  52. /[^abc]/ Character Classes ◦ Znaki w klasie mogą być zanegowane

    ◦ Oznacza każdy znak, który nie znajduje się w klasie razem z nowymi liniami
  53. /[ab^c]/ Character Classes ◦ W innym miejscu traci specjalne znaczenie

  54. Character Classes - skróty \w słowo [A-Za-z0-9_] \W wszystko oprócz

    słów [^A-Za-z0-9_] \d cyfra [0-9] \D wszystko oprócz cyfr [^0-9] \s biały znak [ \n\r\t\f] \S wszystko oprócz białych znaków [^ \n\r\t\f]
  55. Character Classes - skróty \w słowo [A-Za-z0-9_] \W wszystko oprócz

    słów [^A-Za-z0-9_] \d cyfra [0-9] \D wszystko oprócz cyfr [^0-9] \s biały znak [ \n\r\t\f] \S wszystko oprócz białych znaków [^ \n\r\t\f] . Kropka [^\n]
  56. Alternatives

  57. Alternatives /Kirk|Spock/ Kirk

  58. Alternatives /Kirk|Spock/ Kirk Spock

  59. Alternatives /Kirk|Spock/ Kirk Spock Kirk Spock

  60. Metacharacters - Quantifier /Ca*pti+n K?i{1,3}rk/

  61. /Ca*pti+n K?i{1,3}rk/ Kwantyfikator określa powtórzenia poprzedniego znaku lub grupy Metacharacters

    - Quantifier
  62. /Ca*pti+n K?i{1,3}rk/ ◦ * zero lub więcej (0 → ∞)

    Metacharacters - Quantifier
  63. /Ca*pti+n K?i{1,3}rk/ ◦ * zero lub więcej (0 → ∞)

    ◦ + jedno lub więcej (1 → ∞) Metacharacters - Quantifier
  64. /Ca*pti+n K?i{1,3}rk/ ◦ * zero lub więcej (0 → ∞)

    ◦ + jedno lub więcej (1 → ∞) ◦ ? zero lub jedno (0 → 1) Metacharacters - Quantifier
  65. /Ca*pti+n K?i{1,3}rk/ ◦ * zero lub więcej (0 → ∞)

    ◦ + jedno lub więcej (1 → ∞) ◦ ? zero lub jedno (0 → 1) ◦ {x,y} od x do y (x → y) Metacharacters - Quantifier
  66. /Ca*pti+n K?i{1,3}rk/ ◦ * zero lub więcej (0 → ∞)

    = {0,} ◦ + jedno lub więcej (1 → ∞) = {1,} ◦ ? zero lub jedno (0 → 1) = {0,} ◦ {x,y} od x do y (x → y) Metacharacters - Quantifier
  67. Quantifier - greediness

  68. Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott Quantifier - greediness

  69. Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott Quantifier - greediness

  70. Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott Quantifier - greediness /".+"/

  71. Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott Quantifier - greediness /".+"/

  72. Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott Quantifier - greediness /".+?"/

  73. Quantifier - greediness *? +? {,}? ?? ◦ Aby zmienić

    kwantyfikator na leniwy wystarczy dodać ?
  74. Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott Quantifier - greediness /".+"/U

    ◦ Odwraca zachłanność kwantyfikatorów
  75. Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott Quantifier - greediness /"[^"]+"/

  76. Quantifier - greediness /"[^"]+"/ Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott

  77. Quantifier - greediness /"[^"\r\n]+"/ Dr. Leonard "Bones" McCoy,Montgomery "Scotty" Scott

  78. Assertions and anchors

  79. Assertions and anchors ◦ Najczęściej spotykanym typem assercji jest anchor

    (kotwica) ◦ Pozwala na szukanie wzorca na ustalonej pozycji
  80. Assertions and anchors ◦ Najczęściej spotykanym typem assercji jest anchor

    (kotwica) ◦ Pozwala na szukanie wzorca na ustalonej pozycji /^k/i Kirk
  81. Assertions and anchors ◦ Znak karetki oznacza, że napis musi

    zaczynać się od znaku k /^k/i Kirk
  82. Assertions and anchors ◦ Znak dolara oznacza, że napis musi

    się kończyć się znakiem k /k$/i Kirk
  83. Assertions and anchors ◦ Znak dolara oznacza, że napis musi

    się kończyć się znakiem k ◦ Dolar wyszuka koniec napisu przed znakiem nowej lini /k$/ Kirk\n
  84. Assertions and anchors /apple/i Apple

  85. Assertions and anchors /apple/i Apple ✓ Pineapple ✓

  86. Assertions and anchors /^apple/i Apple ✓ Pineapple

  87. Assertions and anchors /^apple/i Apple ✓ Pineapple ✘

  88. Assertions and anchors /apple$/i Apple ✓ Apple-pie

  89. Assertions and anchors /apple$/i Apple ✓ Apple-pie ✘

  90. Assertions and anchors /^apple$/i Apple ✓ Apple-pie ✘

  91. Assertions and anchors /^apple$/i Apple ✓ Pineapple ✘ Apple-pie ✘

  92. Assertions and anchors Captain James T. Kirk Commander Spock Commander

    Dr. Leonard McCoy
  93. Assertions and anchors Captain James T. Kirk Commander Spock Commander

    Dr. Leonard McCoy /^c\w+/im
  94. Assertions and anchors Captain James T. Kirk Commander Spock Commander

    Dr. Leonard McCoy /^c\w+/im ◦ Karetka (^) wyszuka pasujące ciągi, zaraz po znaku nowej lini
  95. Assertions and anchors /\Ac\w+/im Captain James T. Kirk Commander Spock

    Commander Dr. Leonard McCoy
  96. Assertions and anchors Captain James T. Kirk Commander Spock Commander

    Dr. Leonard McCoy ◦ \A oznacza, że napis jest szukany tylko na samym początku /\Ac\w+/im
  97. Assertions and anchors Captain James T. Kirk Commander Spock Commander

    Dr. Leonard McCoy ◦ \A oznacza, że ciąg jest szukany tylko na samym początku napisu ◦ \Z wyszuka sam koniec napisu przed znakiem nowej linii ◦ \z wyszuka koniec napisu /\Ac\w+/im
  98. Word boundaries right to vote

  99. Word boundaries right to vote

  100. Word boundaries right to vote /\bto\b/

  101. Word boundaries right to vote /\bto\b/

  102. Word boundaries right to vote /\bto\b/

  103. Word boundaries come together /\bto\b/

  104. Word boundaries come together ✘ /\bto\b/

  105. Word boundaries come together /\bto\B/

  106. Word boundaries come together /\bto\B/

  107. Word boundaries nr2br /\B2\B/

  108. Word boundaries nr2br ✓ /\B2\B/

  109. Other assertions ◦ Możemy tworzyć własne asercje ◦ Służy do

    tego konstrukcja ?=
  110. Other assertions Kirk,Spock,McCoy /[a-z]+(?=,)/i ◦ Positive look ahead ◦ Pozytywne

    przewidywanie (positive assertions)
  111. Other assertions Kirk,Spock;McCoy /[a-z]+(?=,|;)/i ◦ Positive look ahead ◦ Pozytywne

    przewidywanie (positive assertions) ◦ Można używać alternatywy
  112. Other assertions Kirk,Spock,McCoy /Kirk(?!,Spock)/i ◦ Negative look ahead ◦ Negatywne

    przewidywanie (negative assertions)
  113. Other assertions Kirk,Spock,McCoy ✘ /Kirk(?!,Spock)/i ◦ Negative look ahead ◦

    Negatywne przewidywanie (negative assertions)
  114. Other assertions Kirk,Spock,McCoy ✘ Kirk,McCoy,Spock ✓ /Kirk(?!,Spock)/i ◦ Negative look

    ahead ◦ Negatywne przewidywanie (negative assertions)
  115. Other assertions Spock,Kirk,McCoy /(?=Spock,)Kirk/i ◦ Jak dopasować coś przed kursorem?

  116. Other assertions Spock,Kirk,McCoy /(?=Spock,)Kirk/i ◦ Jak dopasować coś przed kursorem?

    Spock != Kirk
  117. Other assertions Spock,Kirk,McCoy /(?<=Spock,)Kirk/i ◦ Jak dopasować coś przed kursorem?

    ◦ Opcja: ?<=
  118. Other assertions Spock,Kirk,McCoy ✓ /(?<=Spock,)Kirk/i ◦ Jak dopasować coś przed

    kursorem? ◦ Opcja: ?<= pozytywne przewidywanie wsteczne (positive look behind)
  119. Other assertions Spock,Kirk,McCoy ✓ McCoy,Kirk,Spock ✘ /(?<!McCoy,)Kirk/i ◦ Opcja: ?<!

    negatywne przewidywanie wsteczne (negative look behind)
  120. Subpatterns

  121. Subpatterns /(captain)(kirk)/ captainkirk

  122. Subpatterns /(captain)(kirk)/ captainkirk ◦ Za pomocą nawiasów oznaczamy podłańcuchy

  123. Subpatterns /(captain)(kirk)/ captainkirk

  124. Subpatterns /(captain)(kirk)/ captainkirk 1:captain 2:kirk ◦ Podłańcuchy mogą być użyte

    do wyłuskiwania części dopasowania
  125. Subpatterns /((captain)(kirk))/ captainkirk 2:captain 3:kirk ◦ Podłańcuchy numerowane są od

    lewej do prawej 1:captainkirk
  126. Subpatterns /(a.c)\1/ ◦ Do znalezionych podłańcuchów można się odwoływać abcabc

    ✓ adcabc ✘
  127. Subpattern Options /(?#Komentarz w podłańcuchu.)/ ◦ W podłańcuchach można używać

    pewne opcje oraz modyfikatory.
  128. Subpattern Options /(?OptionPattern)/ ◦ Składnia opcji w podłańcuchach

  129. Subpattern Options /((?i)[a-z]+) [a-z]+/ Captain kirk ◦ Ustawienie braku wrażliwości

    na wielkość liter
  130. Subpattern Options /((?i)[a-z]+) [a-z]+/ ◦ Ustawienie braku wrażliwości na wielkość

    liter Captain kirk
  131. Subpattern Options /((?i)[a-z]+) [a-z]+/ ◦ Ustawienie braku wrażliwości na wielkość

    liter Captain kirk Captain Kirk ✘
  132. Non-capturing subpatterns /box(?:ers)?/ ◦ Użycie ?: zaraz po nawiasie otwierającym

    podłańcuch spowoduje, że grupa nie zostanie przechwycona boxers
  133. Named subpatterns Captain Kirk /(?P<rank>Captain) Kirk/

  134. Named subpatterns Captain Kirk /(?P<rank>Captain) Kirk/ rank: Captain

  135. Backtracking

  136. Backtracking ◦ Algorytm z nawrotami

  137. Backtracking ◦ Algorytm z nawrotami ◦ Jeśli wybrana droga nie

    prowadzi do rozwiązania, silnik wykona nawrót do poprzedniego punktu, w kórym może podjąć decyzję.
  138. Backtracking ◦ Algorytm z nawrotami ◦ Jeśli wybrana droga nie

    prowadzi do rozwiązania, silnik wykona nawrót do poprzedniego punktu, w kórym może podjąć decyzję.
  139. Backtracking - example /\d+00/

  140. Backtracking - example /\d+00/ 12300

  141. Backtracking - example /\d+00/ 12300

  142. Backtracking - example /\d+00/ 12300

  143. Backtracking - example /\d+00/ 12300

  144. Backtracking - example /\d+00/ 12300

  145. Backtracking - example /\d+00/ 12300

  146. Backtracking - example /\d+00/ 12300 ◦ Łańcuch się skończył, a

    trzeba jeszcze sprawdzić 00
  147. Backtracking - example /\d+00/ 12300 ◦ backtrack

  148. Backtracking - example /\d+00/ 12300 ◦ backtrack

  149. Backtracking - example /\d+00/ 12300

  150. Backtracking - example /\d+00/ 12300 ✓

  151. Backtracking - example2 /\d+ff/ 123dd

  152. Backtracking - example2 /\d+ff/ 123dd

  153. Backtracking - example2 /\d+ff/ 123dd

  154. Backtracking - example2 /\d+ff/ 123dd

  155. Backtracking - example2 /\d+ff/ 123dd ◦ nie udało się znaleźć

    f
  156. Backtracking - example2 /\d+ff/ 123dd ◦ backtrack

  157. Backtracking - example2 /\d+ff/ 123dd ◦ backtrack

  158. Backtracking - example2 /\d+ff/ 123dd ◦ nie można się cofnąć

    dalej bo +
  159. Backtracking - example2 /\d+ff/ 123dd ✘

  160. Backtracking - example3 /ab??c/ abc

  161. Backtracking - example3 /ab??c/ abc

  162. Backtracking - example3 /ab??c/ abc ◦ Nie ma c na

    drugim miejscu
  163. Backtracking - example3 /ab??c/ abc ◦ Nie ma c na

    drugim miejscu
  164. Backtracking - example3 /ab??c/ abc ◦ backtrack ◦ spróbuj dopsaować

    b
  165. Backtracking - example3 /ab??c/ abc

  166. Backtracking - example3 /ab??c/ abc ✓

  167. Atomic grouping

  168. Atomic grouping ◦ Wyłączenie backtrackingu i niepozwalanie na nawroty może

    być pomocne ◦ Celem jest przyśpieszenie nieudanych dopasowań, zwłaszcza przy zagnieżdżonych kwantyfikatorach
  169. Atomic grouping (?>regex) ◦ Grupy atomowe nie zostaną przechwycone

  170. Atomic grouping (?>\d+)ff

  171. Atomic grouping (?>\d+)ff \d++ff ◦ Aby zmienić kwantyfikator na zaborczy

    (possessive) wystarczy dodać +
  172. Atomic grouping (?>\d+)ff \d++ff ◦ Aby zmienić kwantyfikator na zaborczy

    (possessive) wystarczy dodać + ◦ Kwantyfikatory takie są zawsze zachłanne
  173. Atomic grouping (?>\d+)ff \d++ff ◦ Aby zmienić kwantyfikator na zaborczy

    (possessive) wystarczy dodać + ◦ Kwantyfikatory takie są zawsze zachłanne ◦ Pamiętaj, że może to zmienić wynik dopasowania
  174. Atomic grouping /\w+d/ abcdef ◦ Pamiętaj, że może to zmienić

    wynik dopasowania /\w++d/
  175. Atomic grouping /\w+d/ abcdef ◦ Pamiętaj, że może to zmienić

    wynik dopasowania /\w++d/
  176. Unicode

  177. Unicode /^abcdef$/u

  178. Unicode /^abcdef$/u ◦ Modyfikator u ◦ UTF-8 Mode

  179. Unicode - UTF-8 Mode ◦ Kody ASCII (0-127) są identyczne

    ◦ 2-4 Bajty użyte do reprezentacji znaków (Codepoints) ◦ Każdy codepoint jest uważany za jeden znak.
  180. Unicode Świerzop

  181. Unicode Świerzop /\x{015A}/u

  182. Unicode Świerzop /\x{015A}/u

  183. Unicode Świerzop /[a-z\x{0104}-\x{017C}]+/u

  184. Unicode Świerzop 한국어 /\p{L}+/u

  185. Czytelność /foobar/x

  186. Czytelność Łatwo przeczytać? /^[a-z0-9_%.-]+@[a-z0-9.-]+\.[a-z]{2,4}$/iD

  187. Czytelność / ^ # początek łańcucha [a-z0-9_%.-]+ # user @

    # delimiter @ [a-z0-9.-]+ # domena \. # delimiter . [a-z]{2,4} # top level domain $ # koniec łańcucha /iDx
  188. Czytelność / ^ # początek łańcucha [a-z0-9_%.-]+ # user @

    # delimiter @ [a-z0-9.-]+ # domena \. # delimiter . [a-z]{2,4} # top level domain $ # koniec łańcucha /iDx ◦ Wszystko zaczynajace sie od znaku # do końca linii jest komentarzem
  189. Czytelność / ^ # początek łańcucha [a-z0-9_%.-]+ # user @

    # delimiter @ [a-z0-9.-]+ # domena \. # delimiter . [a-z]{2,4} # top level domain $ # koniec łańcucha /iDx ◦ Białe znaki są ignorowane jeśli nie są wyescapowane (\ )
  190. Czytelność / ^ # początek łańcucha [a-z0-9_%.-]+ # user @

    # delimiter @ [a-z0-9.-]+ # domena \. # delimiter . [a-z]{2,4} # top level domain $ # koniec łańcucha /iDx ◦ Białe znaki są ignorowane jeśli nie są wyescapowane (\ )
  191. PHP

  192. PHP $template = "Welcome on [ship_name]! Sincerely, [captain_name]";

  193. PHP $template = "Welcome on [ship_name]! Sincerely, [captain_name]"; $template =

    str_replace("[ship_name]",$data['ship_name'], $template); $template = str_replace("[captain_name]",$data[captain_name], $template);
  194. PHP $template = "Welcome on [ship_name]! Sincerely, [captain_name]"; $template =

    preg_replace_callback('#\[([a-z_])+\]#', 'my_callback', $template); function my_callback($matches) { ... }
  195. Linki i Narzędzia ◦ http://www.pcre.org/pcre.txt ◦ Philip Hazel - Mastering

    regular expressions ◦ http://www.regular-expressions.info/ ◦ RegexBuddy ◦ http://rubular.com/
  196. Dziękuję Pytania?