PHP 5 about PHP 5 старт PHP 5 установка PHP 5 синтаксис PHP 5 змінні PHP 5 echo і print PHP 5 типи даних PHP 5 strings PHP 5 константи PHP 5 оператори PHP 5 if...else...elseif PHP 5 switch PHP 5 цикл while PHP 5 for і foreach PHP 5 функції PHP 5 масиви PHP 5 сортування масивів PHP 5 superglobals PHP 5 форми input PHP 5 форми обробка PHP 5 форми - обов'язкові поля PHP 5 форми - перевірка електронної пошти і URL РНР 5 форми заповнення PHP 5 багатовимірні масиви PHP 5 час і дата PHP 5 include PHP 5 файли обробка PHP 5 файли Open/Read/Close PHP 5 файли створення / запис PHP 5 файли завантаження PHP MySQL бази даних PHP MySQL Підключення PHP MySQL Створення бази даних PHP MySQL Створення таблиці PHP MySQL вставка даних PHP MySQL Отримання ідентифікатора останнього доданого запису PHP MySQL вставка кількох записів PHP MySQL Підготовлені вирази PHP MySQL відображення даних з таблиці PHP MySQL Видалення даних PHP MySQL оновлення даних PHP MySQL обмежити вибірку даних PHP регулярні вирази 1 PHP регулярні вирази 2 PHP регулярні вирази 3 PHP регулярні вирази 4 PHP ООП PHP ООП class PHP ООП модифікатори доступу PHP ООП extends PHP ООП статичні методи і властивості, константи PHP ООП abstract PHP ООП interface PHP альтернативний синтаксис керуючих конструкцій

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


Продовження уроку по регулярних виразах.


Мета символ  ?

Знак питання ? співпаде з нулем або ОДНИМ ( 0 або 1 ) входженням символу або регулярним виразом, зазначеним відразу перед ним. Корисний для вказівки опціональних символів ( яких може і не бути ) .

Наприклад, телефонний номер в якоїсь країни: 1234-567890.

<?php
// create a string
$string = '1234567890';

// look for a match
echo preg_match('#1234-?567890#', $string, $matches);   //  1
?>

Результат скрипта:
1

Тому що -? збігся 0 раз з символом " - ". Зміна рядка на " 1234-567890 " видасть той же результат.


Фігурні дужки {}

Вказує на кількість символів які збіглися або їх інтервал.
Наприклад, за фразою PHP має слідувати ТОЧНО ТРИ цифри:

<?php
// create a string
$string = 'PHP123';

// look for a match
echo preg_match('#PHP[0-9]{3}#', $string, $matches);    //  1
?> 

Результат скрипта:
1


Шаблон PHP 0-9 (цифри від 0 до 9) {3} (три рази) збігся.

спеціальні послідовності

Бекслеш ( \ ) використовується для спец. послідовностей:

\d - будь-яка цифра (теж саме що і [0-9] )
\D - будь-яка НЕ ​​цифра ( [^0-9] )
\s - всі "не символи" - пробіли, переклади рядки, табуляція ( [ \t\n\r\f\v] )
\S - всі НЕ "недосимволи" ( [^ \t\n\r\f\v] )
\w - всі альфа-цифрові символи (буквено-числові) ( [a-zA-Z0-9_] )
\W - всі НЕ альфа-цифрові символи ( [^a-zA-Z0-9_] )

Отже, використовуючи послідовності ( прапори ) ми можемо скоротити наші регулярні виразиі поліпшити їх читабельність.

<?php
// create a string
$string = 'ab-ce*fg@ hi & jkl(mnopqr)stu+vw?x yz0>1234<567890';

// match our pattern containing a special sequence
preg_match_all('#[\w]#', $string, $matches);

// loop through the matches with foreach
foreach ($matches[0] as $value) {   //  abcefghijklmnopqrstuvwxyz01234567890
    echo $value;
}
?>

Результат скрипта:
abcefghijklmnopqrstuvwxyz0123456789

Ми знайшли ( preg_match_all ) всі цифри і букви ( \w ) класу ( [] ) .

На наступному прикладі ми можемо переконатися, що рядок не містить чисел.

<?php
// create a string
$string = '2 bad for perl';

// echo our string
if (preg_match('#^\d#', $string)) {     //  String begins with a number
    echo 'String begins with a number';
} else {
    echo 'String does not begin with a number';
}
?>

Метасимвол  . (крапка)

. збігається один раз з будь-яким символом ( крім розриву рядка ) :

<?php
// create a string
$string = 'abcdefghijklmnopqrstuvwxyz0123456789';

// try to match any character
if (preg_match('#.#', $string)) {   //  The string contains at least on character 
    echo 'The string contains at least on character';
} else {
    echo 'String does not contain anything';
}
?>

Результат скрипта:
The string contains at least on character

Звичайно, код містить хоча б один символ.
Раніше була розглянута проблема знаходження символу розриву рядка, тому що " . " не збігається з таким символом ( \n ).
Тут нам на допомогу прийде прапор \s . Він знайде будь-який символ пробілу ( недосимвол ) .

Для прикладу використовуємо \n .

<?php
// create a string
$string = 'box' . "\n" . 'at' . "\n" . 'noon' . "\n" . 'taxes' . "\n";

// echo the string
echo nl2br($string);

// look for a match
echo preg_match_all('#\s#', $string, $matches);     //  4
?>

Результат скрипта:
box
at
noon
taxes
4

preg_match() знайшов 4 збіги переводу рядка \n .


Більш складні вирази.

Розглянемо оператор OR ( АБО ).
У регулярних виразах це символ " | " (Труба, канал).

Настав час показового "Hello World" скрипта.

<?php
// a simple string
$string = "This is a Hello World script";

// try to match the patterns This OR That OR There
echo preg_match('#^(This|That|There)#', $string);   //  1
?>

Ускладнимо завдання: спробуємо знайти одночасно Hello або Jello в рядку.

<?php
// a simple string
$string = "This is a Hello World script";

// try to match the patterns Jello or Hello
if (!preg_match('#(Je|He)llo#', $string)) {     //  pattern found
    echo 'Pattern not found';
} else {
    echo 'pattern found';
}
?>

Хоча шаблон збігся, ми не бачимо яку  саме строку ми знайшли.
Для повернення знайдених результатів в preg_match додається третій параметр ( &$matches ):

<?php
// a simple string
$string = "This is a Hello World script";

// try to match the patterns Jello or Hello
// put the matches in a variable called matches
preg_match('#(Je|He)llo#', $string, $matches);

// loop through the array of matches and print them
foreach ($matches as $key => $value) {
    echo $key . '->' . $value . '<br />';
}
?>

Результат скрипта:

0-> Hello
1-> He

Елемент масива $matches[0] містить всі співпалі рядки (завжди), в прикладі - Hello.
Наступні елементи містять послідовні входження субпаттернів " () ".
$matches[1] співпадає з першим субпатерном. У прикладі - (Je|He)


Модифікатори і ствердження

Модифікатори змінюють поведінку шаблонів регулярних виразів.

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

i - регістронезалежний (Ignore Case, case insensitive)
U - нежадний пошук (Make search ungreedy)
s - включно перевід строки (Includes New line)
m - мультистрока (Multiple lines)
x - Extended for comments and whitespace
e - Enables evaluation of replacement as PHP code. (preg_replace only)
S - Extra analysis of pattern

Ствердження (Assertions)

b - границя слова (Word Boundry)
B - НЕ границя слова (Not a word boundary)
A - початок шаблона (Start of subject)
Z - кінець шаблона або розрив строки (End of subject or newline at end)
z - кінець шаблона (End of subject)
G - перша співпавша позиція у шаблоні (First matching position in subject)

Простий приклад модифікатора " i "

<?php
// create a string
$string = 'abcdefghijklmnopqrstuvwxyz0123456789';

// try to match our pattern
if (preg_match('#^ABC#i', $string)) {   //      Співпадіння, строка починається з abc
    echo 'Співпадіння, строка починається з abc';
} else {
    echo 'false';
}
?>

Використання модифікатора " s "

<?php
/*** create a string with new line characters ***/
$string = 'box' . "\n" . 'at' . "\n" . 'noon' . "\n" . 'taxes' . "\n";

/*** look for a match */
echo preg_match('#box.at.noon#', $string, $matches);    //  0
?>

Результат скрипта:
0

" . " не знаходить символи розриву рядка, додамо модифікатор " s " щоб це виправити

<?php
/*** create a string with new line characters ***/
$string = 'box' . "\n" . 'at' . "\n" . 'noon' . "\n" . 'taxes' . "\n";

/*** look for a match */
echo preg_match('#box.at.noon#s', $string, $matches);    //  1
?> 

Результат скрипта:
1

Розриви рядків дозволяють нам використовувати модифікатор " m ".
Це магічний модифікатор. Він приймає рядок за однострочний з символом розриву на кінці, навіть якщо в рядку насправді більше символів розриву ( мультистрока ).
Тобто якщо в рядку немає символів розриву рядків, цей модифікатор нічого не означає.

<?php
// create a string
$string = 'box' . "\n" . 'at' . "\n" . 'noon' . "\n" . 'taxes' . "\n";

// look for a match
if (preg_match('#^noon#im', $string)) {     //  Pattern Found
    echo 'Pattern Found';
} else {
    echo 'Pattern not found';
}
?>

Результат скрипта:
Pattern Found

Звичайно регулярний вираз знайде збіг.
Все що йде після першого символу розриву рядка відкидається через модифікатора " m ".

У прикладі використовуються разом модифікатори " i " і " m ", їх дія комбінується.

" x " модифікатор дозволяє складати регулярний вираз на декількох рядках, що підвищує його читабельність і дозволяє додавати коментарі усередині шаблону.

<?php
// create a string
$string = 'box' . "\n" . 'at' . "\n" . 'noon' . "\n" . 'taxes' . "\n";

// create our regex using comments and store the regex
// in a variable to be used with preg_match
$regex = '
/     # opening double quote
^     # caret means beginning of the string
noon  # the pattern to match
/imx
';

// look for a match
if (preg_match($regex, $string)) {
    echo 'Pattern Found';
} else {
    echo 'Pattern not found';
}
?>

Код пояснень не потребує, він просто демонструє як можна вставити коментарі та написати вираз в кілька рядків.


Наш партнер:
beta test mp3 playlist downloader