Відмінності між версіями «Регулярні вирази PHP»

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук
(Створена сторінка: ==Регулярні вирази PHP== Регулярні вирази - потужний гнучкий інструмент для синтаксичного а...)
 
(Спецсимволи всередині символьного класу)
 
(не показано 6 проміжних версій цього учасника)
Рядок 10: Рядок 10:
 
Приклад: '/ pattern / i' - відповідає рядку, в якому є слово pattern. i - це модифікатор.
 
Приклад: '/ pattern / i' - відповідає рядку, в якому є слово pattern. i - це модифікатор.
  
===1 - Спецсимволи===
+
== Спецсимволи ==
 
\ - Символ екранування.
 
\ - Символ екранування.
 
Приклад: '/ qwe \ / rty /' - відповідає рядку, в якому є qwe / try. Символ / ми заекранувати, після чого він перестав виконувати в даному місці своє спеціальне значення (він був обмежувачем шаблону).
 
Приклад: '/ qwe \ / rty /' - відповідає рядку, в якому є qwe / try. Символ / ми заекранувати, після чого він перестав виконувати в даному місці своє спеціальне значення (він був обмежувачем шаблону).
Рядок 33: Рядок 33:
 
'''{A, b}''' - кількість входжень попереднього символу або підмаски від а до b. Якщо b не вказаний, вважається, що верхньої межі немає. Наприклад, * - те ж саме, що '''{0,}'''. '''?''' - Те ж, що й '''{0,1}'''. '''{5,7}''' - 5,6 або 7 повторень.
 
'''{A, b}''' - кількість входжень попереднього символу або підмаски від а до b. Якщо b не вказаний, вважається, що верхньої межі немає. Наприклад, * - те ж саме, що '''{0,}'''. '''?''' - Те ж, що й '''{0,1}'''. '''{5,7}''' - 5,6 або 7 повторень.
  
===Спецсимволи всередині символьного класу===
+
=== Спецсимволи всередині символьного класу===
 
'''^''' - Заперечення.
 
'''^''' - Заперечення.
  Приклад: [^ da] - відповідає будь-якому символу крім d і a.
+
  Приклад: [^da] - відповідає будь-якому символу крім d і a.
  Приклад: [^ ^] - відповідає будь-якому символу крім ^.
+
  Приклад: [^^] - відповідає будь-якому символу крім ^.
  Приклад: [d ^ a] - відповідає будь-якому символу з перерахованих трьох. [\ ^ da] - те ж саме.
+
  Приклад: [d^a] - відповідає будь-якому символу з перерахованих трьох. [\^da] - те ж саме.
 
В останньому прикладі, як видно символ стоїть не на початку перерахування і свою метафункцію втрачає. І екранувати його, до речі, теж тут не треба.
 
В останньому прикладі, як видно символ стоїть не на початку перерахування і свою метафункцію втрачає. І екранувати його, до речі, теж тут не треба.
 
'''-''' - Всередині символьного класу означає символьний інтервал.
 
'''-''' - Всередині символьного класу означає символьний інтервал.
 
Приклад: [0-9a-e] - відповідає будь-якому символу від 0 до 9 і від a до e. Якщо в символьному класі треба перерахувати сам символ дефіса, то слід або заекранувати його, або розмістити перед ''']'''.
 
Приклад: [0-9a-e] - відповідає будь-якому символу від 0 до 9 і від a до e. Якщо в символьному класі треба перерахувати сам символ дефіса, то слід або заекранувати його, або розмістити перед ''']'''.
 
В символьному класі треба обережно використовувати символ '''\'''. Якщо його поставити перед ''']''', вона може заекрануватися. Також заекрануватись може  будь-який символ, який може бути заекранованим. Інакше символ '''\''' є звичайним символом.
 
В символьному класі треба обережно використовувати символ '''\'''. Якщо його поставити перед ''']''', вона може заекрануватися. Також заекрануватись може  будь-який символ, який може бути заекранованим. Інакше символ '''\''' є звичайним символом.
Символ $ теж є звичайним символом всередині символьного класу. І дужки теж.
+
Символ '''$''' теж є звичайним символом всередині символьного класу. І дужки теж.
 +
 
 +
===Символ '''\''' ===
 +
Одна з його функцій - зняття спеціального значення з спецсимволів. А інша, навпаки додання спеціальних функцій звичайним символам.
 +
'''\cx''' - ctrl + x. На місці x може бути будь-який символ.
 +
'''\e''' - escape.
 +
'''\f''' - розрив сторінки.
 +
'''\n, \r, \t''' - це нам і так звично. Переклад рядка, повернення каретки і табуляція.
 +
'''\d''' - будь-який символ, що означає десяткову цифру.
 +
'''\D''' - будь-який символ, не означає десяткову цифру.
 +
'''\s''' - будь символ пробілу.
 +
'''\S''' - не пробільний.
 +
'''\w''' - будь-яка цифра, буква або знак підкреслення.
 +
'''\W''' - будь-який символ, але не '''\w.'''
 +
'''\b''' - кордон слова. Можна використовувати замість '''\w \W''' або '''\W \w''' або '''^\w''' або '''\w$'''
 +
'''\B''' - не межа слова.
 +
Дві останні конструкції не відповідають жодним реальним символам.
 +
'''\xHH''' - символ з шістнадцяткові кодом HH. x - це саме буква ікс.
 +
'''\DDD''' - символ з вісімковий кодом DDD. Або посилання на подмаскі.
 +
 
 +
==Звичайні символи==
 +
Це символи, які не є спеціальними. [\ 044 - \ 056]
 +
 
 +
==Модифікатори==
 +
Вказуються вони або в дужках, наприклад так: (? Ui), або після закриває символу '/ pattern / Ui'.
 +
i - регістро-незалежні.
 +
U - інвертує "жадібність".
 +
m - багато-рядковий пошук.
 +
s - якщо використовується, то символ '''.''' відповідає й перекладу рядка. Інакше вона йому не відповідає.
 +
x - змушує ігнорувати всі неекрановані пробільні символи, якщо вони не перераховані в символьному класі.
 +
При використанні модифікаторів, можна використовувати знак '-' для відключення модифікатора. (? mi) - Bмикає багаторядковий пошук і відключаємо регістро-незалежні.
 +
 
 +
==Затвердження==
 +
Твердження - це перевірки щодо символів, що йдуть до або після поточної позиції зіставлення. Наприклад, '''\b''' - це твердження, що попередній символ словесний, а наступний - ні, або навпаки.
 +
 
 +
===Умовні підмаски===
 +
Цього досить: (? (Condition) yes-pattern | no-pattern)
 +
Приклад: (?(?=\D)u|p).(?=\d) - це умова. Ми стверджуємо, що після цього місця йде цифра. Якщо воно істинне, то на даному місці повинна стояти літера u. Інакше - p.
 +
 
 +
==Коментарі==
 +
Коментарі починаються з (? # І тривають до найближчої закриваючої дужки. Так само як / ** / в PHP - без урахування вкладеності.
 +
 
 +
==Функції PHP для роботи з регулярними виразами==
 +
 
 +
'''mixed preg_match (string $ pattern, string $ subject [, array $ & a mp; matches [, int $ flags [, int $ offset]]])'''
 +
Шукає в заданому тексті subject збіги з шаблоном pattern. Якщо збіг не знайдено - поверне false.
 +
У разі, якщо додатковий параметр matches вказаний, він буде заповнений результатами пошуку. Елемент $matches[0] буде містити частину рядка, відповідну входженню всього шаблону, $matches[1] - частина рядка, що відповідає першій підмасці, і так далі. $ Pattern - шаблон, $ subject - де шукати.
 +
 
 +
Схожа функція '''preg_match_all''' з тими ж параметрами. Вона відшукує всі збіги в той час як preg_match - тільки перший збіг.
 +
 
 +
'''array preg_split (string $ patte rn, string $ subject [, int $ limi t [, int $ flags]])'''
 +
Повертає масив, що складається з підрядків заданого рядка '''subject''', який розбита по границях, відповідним шаблоном '''pattern'''.
 +
У разі, якщо параметр '''limit'' вказаний, функція повертає не більше, ніж '''limit''' подрядків. Спеціальне значення '''limit''', рівне -1, має на увазі відсутність обмеження
 +
 
 +
'''mixed preg_replace (mixed $ patt ern, mixed $ replacement, mixed $ subject [, int $ limit])'''
 +
Виконує пошук у рядку '''subject''' збігів з шаблоном pattern і замінює їх на '''replacement'''. У разі, якщо параметр '''limit''' вказаний, буде проведена заміна '''limit''' входжень шаблону; в разі, якщо '''limit''' опущений або дорівнює -1, будуть замінені всі входження шаблону.
 +
'''$Replacement''' може містити посилання на підмаску шаблону. Таким чином, можна поміняти в рядку місцями частини, що відповідають двом різним підмасці.

Поточна версія на 21:24, 19 травня 2013

Регулярні вирази PHP

Регулярні вирази - потужний гнучкий інструмент для синтаксичного аналізу тексту у відповідності з певним шаблоном.

Шаблон - рядок символів, спецсимволів і модифікаторів, що описують правила, яким повинен відповідати текст, що аналізується.

Синтаксис регулярних виразів

Будь-який шаблон повинен бути обмежений символами-обмежувачами. В якості таких символів можна використовувати будь-який не буквено-цифровий символ крім '\'. Не рекомендується використовувати в якості обмежувачів інші спеціальні символи, з причини незручності їх використання усередині шаблону. Переважно всього використовувати символ /, тому що він не виконує ніяких спеціальних функцій. Символ, використовуваний як обмежувач шаблону усередині шаблону повинен екрануватися. Приклад: '/ pattern / i' - відповідає рядку, в якому є слово pattern. i - це модифікатор.

Спецсимволи

\ - Символ екранування. Приклад: '/ qwe \ / rty /' - відповідає рядку, в якому є qwe / try. Символ / ми заекранувати, після чого він перестав виконувати в даному місці своє спеціальне значення (він був обмежувачем шаблону). ^ - Символ початку даних. $ - Символ кінця даних. Приклад:

'/ ^ pattern $ /' - Відповідає рядку, точно збігається з словом pattern. Тобто з літери p рядок починається і після n закінчується.

. (крапка) - Будь-який символ, крім переходу на новий рядок. Але є модифікатор, при використанні якого перехід на новий рядок теж відноситься до "будь-яких" символів. Приклад:

'/ pat.ern /' - Відповідає або рядку, що містить pattern, або patdern, або pat3ern ...

[ ] - Всередині цих дужок перераховуються символи, будь-який з яких може стояти на даному місці. Це називається символьним класом. Спецсимволи, написані у [ ] ведуть себе трохи інакше. Приклад:

'/ pat [aoe] rn /' - під відповідність потраплять тільки рядки, що містять patarn, patorn або patern.

| - Або. Приклад нижче. ( ) - Підмаска. ? - Одне або нуль входжень попереднього символу або підмаски. * - Будь-яку кількість входжень попереднього символу або підмаски. У тому числі й нуль. + - Одне або більше входжень. Приклад:

'/ as + (es | du)?. * R /' - Буква а, потім одна або більше букв s, після цього поєднання es або du може бути один раз, а може м жодного разу, потім будь-яку кількість будь-яких символів і буква r.

В нашому прикладі ось цієї частини '. * R' буде відповідати, наприклад, підрядок asdrfsrsfdr. Як видно, до останньої букви r в неї потрапило ще дві. Це можна вимкнути. Тобто шаблон стане відповідати тільки підрядку asdr. До першого r. Для цього треба в тому місці де це потрібно поставити модифікатор (? U). Ось ще одне застосування символам ? і (). {A, b} - кількість входжень попереднього символу або підмаски від а до b. Якщо b не вказаний, вважається, що верхньої межі немає. Наприклад, * - те ж саме, що {0,}. ? - Те ж, що й {0,1}. {5,7} - 5,6 або 7 повторень.

Спецсимволи всередині символьного класу

^ - Заперечення.

Приклад: [^da] - відповідає будь-якому символу крім d і a.
Приклад: [^^] - відповідає будь-якому символу крім ^.
Приклад: [d^a] - відповідає будь-якому символу з перерахованих трьох. [\^da] - те ж саме.

В останньому прикладі, як видно символ стоїть не на початку перерахування і свою метафункцію втрачає. І екранувати його, до речі, теж тут не треба. - - Всередині символьного класу означає символьний інтервал. Приклад: [0-9a-e] - відповідає будь-якому символу від 0 до 9 і від a до e. Якщо в символьному класі треба перерахувати сам символ дефіса, то слід або заекранувати його, або розмістити перед ]. В символьному класі треба обережно використовувати символ \. Якщо його поставити перед ], вона може заекрануватися. Також заекрануватись може будь-який символ, який може бути заекранованим. Інакше символ \ є звичайним символом. Символ $ теж є звичайним символом всередині символьного класу. І дужки теж.

Символ \

Одна з його функцій - зняття спеціального значення з спецсимволів. А інша, навпаки додання спеціальних функцій звичайним символам. \cx - ctrl + x. На місці x може бути будь-який символ. \e - escape. \f - розрив сторінки. \n, \r, \t - це нам і так звично. Переклад рядка, повернення каретки і табуляція. \d - будь-який символ, що означає десяткову цифру. \D - будь-який символ, не означає десяткову цифру. \s - будь символ пробілу. \S - не пробільний. \w - будь-яка цифра, буква або знак підкреслення. \W - будь-який символ, але не \w. \b - кордон слова. Можна використовувати замість \w \W або \W \w або ^\w або \w$ \B - не межа слова. Дві останні конструкції не відповідають жодним реальним символам. \xHH - символ з шістнадцяткові кодом HH. x - це саме буква ікс. \DDD - символ з вісімковий кодом DDD. Або посилання на подмаскі.

Звичайні символи

Це символи, які не є спеціальними. [\ 044 - \ 056]

Модифікатори

Вказуються вони або в дужках, наприклад так: (? Ui), або після закриває символу '/ pattern / Ui'. i - регістро-незалежні. U - інвертує "жадібність". m - багато-рядковий пошук. s - якщо використовується, то символ . відповідає й перекладу рядка. Інакше вона йому не відповідає. x - змушує ігнорувати всі неекрановані пробільні символи, якщо вони не перераховані в символьному класі. При використанні модифікаторів, можна використовувати знак '-' для відключення модифікатора. (? mi) - Bмикає багаторядковий пошук і відключаємо регістро-незалежні.

Затвердження

Твердження - це перевірки щодо символів, що йдуть до або після поточної позиції зіставлення. Наприклад, \b - це твердження, що попередній символ словесний, а наступний - ні, або навпаки.

Умовні підмаски

Цього досить: (? (Condition) yes-pattern | no-pattern) Приклад: (?(?=\D)u|p).(?=\d) - це умова. Ми стверджуємо, що після цього місця йде цифра. Якщо воно істинне, то на даному місці повинна стояти літера u. Інакше - p.

Коментарі

Коментарі починаються з (? # І тривають до найближчої закриваючої дужки. Так само як / ** / в PHP - без урахування вкладеності.

Функції PHP для роботи з регулярними виразами

mixed preg_match (string $ pattern, string $ subject [, array $ & a mp; matches [, int $ flags [, int $ offset]]]) Шукає в заданому тексті subject збіги з шаблоном pattern. Якщо збіг не знайдено - поверне false. У разі, якщо додатковий параметр matches вказаний, він буде заповнений результатами пошуку. Елемент $matches[0] буде містити частину рядка, відповідну входженню всього шаблону, $matches[1] - частина рядка, що відповідає першій підмасці, і так далі. $ Pattern - шаблон, $ subject - де шукати.

Схожа функція preg_match_all з тими ж параметрами. Вона відшукує всі збіги в той час як preg_match - тільки перший збіг.

array preg_split (string $ patte rn, string $ subject [, int $ limi t [, int $ flags]]) Повертає масив, що складається з підрядків заданого рядка subject, який розбита по границях, відповідним шаблоном pattern. У разі, якщо параметр limit вказаний, функція повертає не більше, ніж limit' подрядків. Спеціальне значення limit, рівне -1, має на увазі відсутність обмеження

mixed preg_replace (mixed $ patt ern, mixed $ replacement, mixed $ subject [, int $ limit]) Виконує пошук у рядку subject збігів з шаблоном pattern і замінює їх на replacement. У разі, якщо параметр limit вказаний, буде проведена заміна limit входжень шаблону; в разі, якщо limit опущений або дорівнює -1, будуть замінені всі входження шаблону. $Replacement може містити посилання на підмаску шаблону. Таким чином, можна поміняти в рядку місцями частини, що відповідають двом різним підмасці.