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 регулярні вирази 3


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


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

Цей модифікатор дозволяє нам проаналізувати рядок до співставлення з шаблонами, що не позначені якорями. Тобто якщо шаблон не має початкової фіксованої позиції, як наприклад:

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

/*** fixed starting position ***/
preg_match('#abc(.*?)hij#', $string,$matches);
print_r($matches);                              //  Array ( [0] => abcdefghij [1] => defg )
?>

Патерн може зупинити виконання шаблону у випадку з множинними збігами.
У наступному прикладі з'являється множинне входження шаблону, тому додамо " S ".

<?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]#S', $string, $matches);

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

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

На практиці модифікатор використовується досить рідко.


Модифікатор кордону слова (word boundary) " \b "

Кордон слова створюється між двох " \b " модифікаторів.
Це спеціальний "підпираючий тип модифікаторів, який дозволяє вказати ТОЧНИЙ збіг.
Текст повинен співпасти тільки з точним шаблоном записаним в  " \b ".
Наприклад, шаблон "cat" не співпаде з "catalog" .

<?php
$string = 'eregi will not be AVAILABLE in PHP 6';

// шукаємо строку "LAB"
if (preg_match('#\bLAB\b#i', $string)) {    //  0
    // співпадіння
    echo $string;
} else {
    echo 'false';
}
?>

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

Ми намагаємося знайти збіг з патерном " LAB ", яке знаходиться всередині рядка в слові " AVAILABLE ".
Через використання кордонів слів, шаблон не збігся із підрядком.
Давайте спробуємо приклад, не використовуючи модифікатора кордонів слів.

<?php
$string = 'eregi will remain in the computer LAB';

// search string "lab"
if (preg_match('#\bLAB\b#i', $string)) {    //  1
//  found
    echo $string;   //  eregi will remain in the computer LAB
} else {
    echo 'false';
}
?>

Результат скрипта:
eregi will remain in the computer lab

Ми бачимо що збіг стався з цілим словом " LAB ". ( \bLAB\b ).


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

Цей модифікатор відноситься до попереднього, але \B не ставить умови границь слова, а навпаки заперечує кордон слів. Цей модифікатор корисний, коли потрібно знайти що-небудь всередині тексту, який знаходиться всередині слова, але не на самому початку або наприкінці фрази.

<?php
$string = 'This lathe turns wood.';

// match word boundary and non-word boundary
if (preg_match('#\Bthe\b#', $string)) {     //  Співпав шаблон "the".
    echo 'Співпав шаблон "the".';
} else {
    echo 'false';
}
?>

Результат скрипта:
Співпав шаблон "the".

Цей код спочатку знайде патерн " the ". Тому що спочатку вказано модифікатор "не межа слова", the знаходиться всередині фрази і не спочатку її, потім модифікатор \b кордону вказує що фраза повинна закінчиться на -the .

<?php
$string = 'The quick brown fox jumps over the lazy dog.';

// match word boundary and non-word boundary
if (preg_match('#\Bthe\b#', $string)) {     //  false
    echo 'Співпав шаблон "the".';
} else {
    echo 'false';
}
?>

Результат скрипта:
false
Цього разу ми нічого не знайшли, тому що " the " стоїть на кордоні слова, а ми використовували модифікатор \B .


Останній модифікатор - \U

За замовчуванням, PCRE "жадібний" - це не означає що вони з'їдять ваші печеньки, а означає що шаблон співпаде з найбільшим можливим кількістю символів, потрапляють під цей шаблон.

Щоб відключити таку "жадібність" регулярних виразів - використовуємо обмежувач " ? ", Наприклад " (. *?) " - використовуємо модифікатор " \U ".

Новачкам бажано використовувати цей модифікатор за замовчуванням, щоб не виникало конфузів.

<?php
$string = 'foobar foo--bar fubar';

// try to match the pattern
if (preg_match('#foo(.*)bar#U', $string)) {     //  Співпав шаблон
    echo 'Співпав шаблон';
} else {
    echo 'false';
}
?>

Результат скрипта:
Співпав шаблон

Інший приклад - є кусок html

<a href="#1">1</a>
<a href="#1">2</a>
<a href="#1">3</a>

Спробуємо знайти всі посилання виразом preg_match_all( '@<a href="#\d+">.*</a>@s' , $string) , код поверне весь цілий шуканий рядок замість трьох посилань. Додавши нежадібний модифікатор U    '@<a href="#\d+">.*</a>@sU'   , всі три посилання окремо.

<?php
$string = '
<a href="#1">1</a>
<a href="#1">2</a>
<a href="#1">3</a>
';

// try to match the pattern
preg_match_all('@<a href="#\d+">.*</a>@s', $string, $matches1);
preg_match_all('@<a href="#\d+">.*\</a>@sU', $string, $matches2);   // add U modificator

print_r($matches1);   //  Array ( [0] => Array ( [0] => 1 2 3 ))
print_r($matches2);   //   Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ))
?>

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