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

  1. Регулярні вирази, сумісні з мовою Perl
  2. Приклад: програма вилучення посилань
  3. Основне регулярний вирази
  4. Використання цього виразу в функції

base10

7

Функції порівняння рядків і пошуку подстрок, розглянуті в попередній статті , Дозволяють успішно справлятися з тими завданнями, для яких вони призначені, але мають суттєві обмеження в тому, що засновані на використанні літеральних значень. В якості ілюстрації того, в чому полягають обмеження цих функцій, розглянемо наступний приклад. Припустимо, потрібно виконати перевірку рядків для визначення того, чи належать ці рядки до конкретного типу імені хоста веб-сайту. Адреси, представлені цим ім'ям, повинні починатися з підрядка www., Закінчуватися підрядком .com і мати в середині одне слово, що складається з великих літер. Як приклад нижче наведені рядки, які мають необхідний формат:

'Www.google.com' 'www.zend.com'

А ці рядки не відповідають зазначеним вимогам:

'Java.sun.com' 'www.java.sun.com' 'www.php.net'

Навіть короткі міркування показують, що в нашому розпорядженні поки що немає зручного способу, що дозволяє скористатися засобами порівняння рядків і підрядків для проведення необхідної перевірки. Ми можемо перевірити наявність подстрок www. і .com, але набагато складніше перевірити відповідність заданим вимогам тієї підрядка, яка знаходиться між ними. Однак з цим завданням дозволяють легко впоратися регулярні вирази.

Для скороченого позначення регулярних виразів в англійській мові застосовується термін regex. Регулярні вислови є шаблони для узгодження з рядками, що містять спеціальні групові символи, які можуть бути узгоджені з цілими фрагментами цільової рядки. Мова PHP дозволяє застосовувати два широких класу регулярних виразів: регулярні вирази, сумісні зі стандартом POSIX (звані розширеними), і звичайні регулярні вирази, сумісні з мовою Perl. Відмінності між цими класами в основному стосуються синтаксису, але є також деякі функціональні відмінності.

В кінцевому підсумку регулярні вирази в стилі POSIX з'явилися підсумком розвитку засобів зіставлення з шаблонами регулярних виразів, використовуваних в інтерпретатора Unix командної стрічки, а регулярні вирази, сумісні з мовою Perl, більшою мірою нагадують відповідні кошти зазначеного мови. Будь-розробник, якому належить виконати хоч скільки-небудь істотний обсяг програмування в середовищі Інтернет, рано чи пізно буде змушений скористатися регулярними виразами.

Починаючи з версії PHP 5.3.0 функції для роботи з регулярними виразами в стилі POSIX є застарілими, тому далі ми будемо розглядати регулярні вирази в стилі Perl.

Регулярні вирази, сумісні з мовою Perl

Для обробки регулярних виразів, сумісних з мовою Perl, в мові PHP застосовується повністю окремий набір функцій, а формування шаблонів здійснюється наступним чином:

  • Шаблони регулярних виразів, сумісних з мовою Perl, завжди починаються і закінчуються одним конкретним символом, який повинен бути однаковим і на початку і в кінці. Цей символ вказує на початок і кінець шаблону. Відповідно до загальноприйнятого угодою для цієї мети найчастіше використовується символ /, але при бажанні може також застосовуватися інший символ. Наступний шаблон, сумісний з мовою Perl: / pattern /, узгоджується з будь-рядком, яка містить в собі рядок (вірніше, подстроку) "pattern".

  • Зіставлення символів з такими ж символами, які не є спеціальними, здійснюється безпосередньо. Наприклад, буква в шаблоні узгоджується з тією ж буквою в цільової рядку.

  • Спеціальний символ ^ узгоджується тільки з початком рядка, а спеціальний символ $ - тільки з кінцем рядка.

  • Спеціальний символ. узгоджується з будь-яким символом.

  • Спеціальний символ * забезпечує узгодження заданого перед ним регулярного виразу в кількості від нуля або більше, а символ + вказує, що узгодження досягається, якщо кількість виявлених в цільової рядку примірників стоїть перед ним регулярного виразу становить від одного і більше.

  • Набір символів, укладений у квадратні дужки, узгоджується з будь-яким з символів цього набору. Наприклад, шаблон [ab] узгоджується і з буквою a, і з буквою b. У квадратних дужках можна також визначити діапазон символів з використанням дефіса. Наприклад, шаблон [ac] узгоджується з буквою a, b або c.

  • Спеціальні символи, відмічені знаком перемикання режиму обробки у вигляді зворотної косої риски (\), втрачають своє спеціальне значення і зіставляються безпосередньо, як звичайні символи.

  • Якщо розглянутий символ не є спеціальним, то шаблон в стилі Perl послідовно погодить символи. Наприклад, шаблон / abc / узгоджується з будь-рядком, яка містить підрядок "abc"

  • Будь-шаблон, за яким слід символ? (Знак питання), означає: "Виконати узгодження конструкції, що передує цьому символу, нуль або один раз".

  • Будь-який символ, який має в регулярному виразі спеціальне значення, може бути перетворений в простий, буквально согласуемое символ шляхом введення перед ним префікса у вигляді зворотної косої межі (знак перемикання на інший режим обробки). Спеціальні символи, які вимагають застосування знака перемикання, щоб можна було виконувати узгодження з їх буквальними значеннями, перераховані нижче.

    . \ + *? [] ^ $ () {} =! <> | :

  • Круглі дужки, що виділяють будь-яку частину шаблону, означають: "Додати подстроку, яка узгоджується з цим подвираженіем, до списку подстрок, узгоджених з шаблоном"

Розглянемо як приклад наступний шаблон:

/тел.\s+(\d\d\d\d\d\d\d)/

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

У наступній таблиці представлені всі дані по використанню спеціальних символів в регулярних виразах:

Спеціальні символи регулярних виразів PHP Класи символів [...] Будь-який із символів, зазначених у дужках [^ ...] Будь-який із символів, не зазначених в дужках. Будь-який символ, крім перекладу рядки або іншого роздільник Unicode-рядка \ w Будь-який символ, який утворює "слово" \ W Будь-який символ, який не є текстовим символом \ s Будь символ пробілу з набору Unicode \ S Будь непробельний символ з набору Unicode. Зверніть увагу, що символи \ w і \ S - це не одне і те ж \ d Будь ASCII-цифри. Еквівалентно [0-9] \ D Будь-який символ, відмінний від ASCII-цифр. Еквівалентно [^ 0-9] Символи повторення {n, m} Відповідає попереднього шаблону, повторенням не менше n і не більше m разів {n,} Відповідає попереднього шаблону, повторенням n або більше разів {n} відповідає в точності n екземплярів попереднього шаблону ? Відповідає нулю або одному примірнику попереднього шаблону; попередній шаблон є необов'язковим. Еквівалентно {0,1} + Відповідає одному або більше примірників попереднього шаблону. Еквівалентно {1,} * Відповідає нулю або більше примірників попереднього шаблону. Еквівалентно {0,} Символи регулярних виразів вибору | Відповідає або подвираженія зліва, або подвираженія справа (аналог логічного операції АБО). (...) Групування. Групує елементи в єдине ціле, яке може використовуватися з символами *, +,?, | і т.п. Також запам'ятовує символи, що відповідають цій групі для використання в наступних посиланнях. (?: ...) Тільки угруповання. Групує елементи в єдине ціле, але не запам'ятовує символи, що відповідають цій групі. Якірні символи регулярних виразів ^ Відповідає початку строкового вираження або початку рядка при багаторядковому пошуку. $ Відповідає кінця строкового вираження або кінця рядка при багаторядковому пошуку. \ B Відповідає кордоні слова, тобто відповідає позиції між символом \ w і символом \ W або між символом \ w і початком або кінцем рядка. \ B Відповідає позиції, яка не є кордоном слів. (? = P) Позитивна випереджальна перевірка на наступні символи. Вимагає, щоб наступні символи відповідали шаблоном p, але не включає ці символи в знайдену рядок. (?! P) Негативна випереджальна перевірка на наступні символи. Вимагає, щоб такі символи не відповідали шаблоном p. \ A початок даних (незалежно від многострочного режиму) \ Z кінець даних або позиція перед останнім перекладом рядка (незалежно від многострочного режиму) Прапори (вказуються в кінці рег. Вираження) i Вказує, що пошук за шаблоном повинен бути нечутливий до регістру символів. m Багаторядковий режим пошуку (multiline). s Якщо даний модифікатор використовується, метасимвол "точка" в шаблоні відповідає всім символам, включаючи переклад рядків. x Якщо використовується даний модифікатор, неекрановані пробіли, символи табуляції і порожнього рядка будуть проігноровані в шаблоні, якщо вони не є частиною символьного класу.

Загальні відомості про функції, сумісних з мовою Perl, наведені в таблиці нижче:

Функції PHP для роботи з регулярними виразами, сумісні з мовою Perl Функція Опис preg_match ()

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

У разі успішного узгодження змінна типу "масив" містить наступні елементи: першим елементом є вся узгоджена подстрока, а наступні елементи містять частини, відповідні укладеним в круглі дужки подвираженія шаблону. Починаючи з версії PHP 4.3.0 передбачена також можливість задати необов'язковий прапор PREG_OFFSET_CAPTURE. Цей прапор змушує функцію preg_match () повертати в зазначеному масиві в розрахунку на кожне узгодження по одному двоелементною масиву, що складається з самих результатів узгодження та інформації про усунення, з якого було розпочато успішне узгодження.

preg_match_all ()

Аналогічна preg_match (), за винятком того, що здійснює всі можливі поспіль йдуть узгодження шаблону з рядком, а не тільки перше узгодження. Значенням є кількість успішно виконаних погоджень. У цій функції третій параметр, масив погоджень, є обов'язковим (якщо потрібне отримання тільки істинного або хибного значення, яке показує наявність або відсутність узгодження, використовуйте функцію preg_match ()). Структура повертається масиву залежить від необов'язкового четвертого параметра (як цього параметра служить константа PREG_PATTERN_ORDER або PREG_SET_ORDER, причому за замовчуванням застосовується перша). При виклику цієї функції можна також застосовувати константу PREG_OFFSET_CAPTURE (ці константи описуються далі).

preg_split ()

Приймає в якості першого параметра шаблон регулярного виразу і другого параметра - рядок, з якої має бути виконано узгодження. Повертає масив, що містить результати розбиття рядка на підрядка в місцях входження розмежувальних рядків, які узгоджуються з шаблоном. Необов'язковий третій параметр (з позначенням граничної кількості) вказує, на скільки подстрок повинна бути розбита рядок, перш ніж буде повернутий отриманий список; значення -1 в позиції третього параметра вказує на те, що межа не встановлюється. Як необов'язкового четвертого параметра може бути заданий прапор PREG_SPLIT_NO_EMPTY (що змушує функцію повертати тільки непусті частини), PREG_SPLIT_DELIM_CAPTURE (яке вимагає повернення всіх подстрок, відповідних укладеним в круглі дужки виразами в шаблоні разграничителя) або PREG_OFFSET_CAPTURE.

preg_replace () Приймає в якості параметрів шаблон, рядок заміни і рядок, в якій повинні бути внесені зміни. Повертає модифіковану рядок, в якій замість кожної підрядка, узгодженої з шаблоном, підставлена ​​рядок заміни. Необов'язковий параметр з позначенням граничної кількості визначає, скільки повинно бути виконано замін (як у функції preg_split ()) preg_replace_callback () Ця функція аналогічна функції preg_repiace (), за винятком того, що другим параметром є ім'я функції зворотного виклику, а не рядок заміни. Ця функція повинна повертати рядки, призначені для використання в якості заміни preg_grep () Приймає в якості параметрів шаблон і масив і повертає масив, що складається з елементів вхідного масиву, який зіставляється з шаблоном. Значення, що перейшли зі старого масиву в новий масив, мають такі ж ключі, як і відповідні елементи вихідного масиву preg_quote () Функція спеціального призначення, призначена для вставки знаків перемикання на інший режим обробки в рядки, які призначені для використання в якості шаблонів регулярних виразів. Для цієї функції потрібна єдиний параметр-рядок, в яку повинні бути вставлені знаки перемикання; повертається значенням є та ж рядок, в якій перед кожним спеціальним символом регулярного виразу вставлена ​​зворотна коса риска (знак перемикання)

Мабуть, найбільш широко використовуваними з цих функцій є preg_match () і preg_match_all (). Перша функція являє собою найкращий засіб отримання відповіді на просте запитання про те, зіставляється чи деякий шаблон з деякою рядком, а остання функція є зручним засобом підрахунку кількості погоджень або отримання відразу всіх узгоджуються подстрок.

Необов'язковий четвертий параметр функції preg_match_all () вимагає додаткових пояснень. Як правило, масив, який містить повертаються результати узгодження, має дворівневу структуру. На першому рівні показана черговість зіставлень (перше зіставлення, друге і т.д.), а на другому показана позиція зіставлення в шаблоні. (Все зіставлення завжди знаходиться на першому місці, а за ним слідують по порядку все субшаблони, позначені круглими дужками.) Питання полягає в наступному: "Який рівень є самим верхнім? Чи повертається масив являти собою список елементів із зазначенням позицій, кожен з яких містить список номерів послідовних погоджень, або даний масив має зворотну структуру? "

Якщо четвертим параметром є PREG_PATTERN_ORDER, то перший елемент містить дані про всі порівняннях з субшаблонамі у всьому шаблоні, другий елемент містить дані про всі порівняннях з першим субшаблоном, укладеними в круглі дужки, і т.д. Якщо ж в якості четвертого параметра застосовується прапорець PREG_SET_ORDER, то перший елемент являє собою список всіх подстрок з першого зіставлення (в цьому списку на початку представлені загальні результати зіставлення, а потім послідовно наведені результати зіставлення з субшаблонамі, укладених в круглі дужки), другий елемент містить всі підрядка з другого зіставлення і так далі (в наступному розділі наведено приклад, який може служити ілюстрацією до цього опису).

Давайте розглянемо спочатку простий приклад, в якому беруться всі телефонні номери з підрядка і вибирається код країни, код міста та номер:

Код PHP $ str = "Телефони нашої компанії: <br> 8 (495) 123-45-67 - офіс в Москві; <br> 1-212-555-75-75 - офіс в Нью-Йорку."; echo "Вихідна рядок: <br> <pre> $ str </ pre>"; // Шаблон регулярного виразу $ pattern = '/ (\ d +) [\ s | \ (| -] * ([\ d] {3}) [\ s | \) | -] * ([\ d | - ] +) / '; preg_match_all ($ pattern, $ str, $ arr, PREG_SET_ORDER); foreach ($ arr as $ entry) {echo "<pre> <br> Знайдене збіг: <b>". $ entry [0]. "</ b> <br>". "Код країни: <em>". $ entry [1]. "</ em> <br>". "Код міста: <em>". $ entry [2]. "</ em> <br>". "Номер: <em>". $ entry [3]. "</ em> <br>"; }

Цей код дасть наступний результат:

Використання регулярних виразів для пошуку телефонних номерів

Я можу довго пояснювати принцип роботи представленого в прикладі регулярного виразу, але я краще покажу:

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

Приклад: програма вилучення посилань

У якості більш складного прикладу того, які дії можуть бути виконані за допомогою регулярних виразів, розглянемо функцію, що дозволяє витягувати посилання з тексту довільної веб-сторінки і виводити отримані результати на екран. Вхідними даними служить URL сторінки, яка повинна бути проаналізована, а вихідними даними є виведений на екран список посилань, представлених на відповідній сторінці. Цей список складається з цільового URL для даної посилання і описового тексту, присутнього в цьому посиланню (який прийнято називати анкором (або якорем посилання)). Для вирішення зазначеного завдання використовуються функції для роботи з регулярними виразами, сумісними з мовою Perl.

Розробка такої функції може стати найпершим кроком при створенні веб-навігатора для пошукової машини. Пошуковики (Google, Yandex і т.п.) завантажують вміст веб-сторінок для їх аналізу та індексації. В ході роботи виникає необхідність розпізнавати посилання на інші сторінки, якщо нове інформаційне наповнення можна буде знайти тільки на цих сторінках.

Основне регулярний вирази

Основою розробляється Невеликий Функції винне служити самє регулярний вирази. Необхідно перш за все розробити таке регулярний вираз, яке зіставляється тільки з посиланнями HTML (і нічим іншим) і може застосовуватися для вилучення фрагментів таких посилань. Посилання HTML, як правило, виглядають таким чином:

<a href="/"> Це мій сайт </a>

Це означає, що посилання задана дескриптором анкора, який має атрибут href, а між початковим дескриптором (<a>) і кінцевим дескриптором (</a>) укладено текст анкора. В даному розділі буде створений шаблон, призначений для зіставлення з посиланням такого спрощеного типу. (Розроблюваний шаблон не дозволяє обробляти всі дані, які відповідно до специфікації мови HTML дозволено використовувати в якості допустимих анкорний посилань. Зокрема, в анкорах дозволені і інші атрибути, крім href, але при вирішенні даної задачі така можливість ігнорується.)

Перш за все необхідно відзначити, що регулярні вирази, що розглядаються як єдине ціле, вважаються досить важкими для сприйняття (в цьому ви могли переконатися на прикладі вище). Тому регулярний вираз, призначене для вирішення даного завдання, буде створюватися на основі декількох чорнових варіантів, опис яких наведено по ходу викладу.

Спочатку розглянемо саме нескладне вираз, яке призначене для пошуку початку дескриптора анкора. Перший чорновий варіант може виглядати наступним чином:

Код PHP // Перший чорновий варіант шаблону для узгодження з посиланнями // дескриптора анкора $ pattern = '/ <a href="[^"]+"> /';

Зверніть увагу на те, що розробляється шаблон ще не призначений для використання в працездатному коді PHP; в даному випадку створюється чорновий варіант вираження, яке повинно бути вставлено в код PHP пізніше. Звичайною мовою перший чорновий визначення дескриптора анкора можна описати як що складається з лівої кутової дужки, за якою слідує буква "a", потім - пробіл, слідом за ним - рядок "href =", знак подвійної лапки, довільну кількість символів, відмінних від знаків лапки, заключний знак лапки і, нарешті, права кутова скоба. Після його складання все вираз полягає в пару символів косою риси, які служать для машини обробки регулярних виразів вказівкою на те, де починається і закінчується вираз.

Конструкція [^ "] + в середині цього виразу означає приблизно наступне: квадратні дужки вказують застосовуваний набір символів, а знак вставки (^), який безпосередньо випливає за лівої дужки, вказує, що використовується заперечення цього безлічі символів. Таким є безліч, що містить всі символи, які не перебувають в подальшому списку. Нарешті, знак + після позначення класу символів, укладеного в квадратні дужки, показує, що мається на увазі наявність в шаблоні щонайменше одного символу, відмінного від лапки.

Як вже було сказано, ми не ставили перед собою завдання точно відобразити синтаксис, запропонований специфікацією HTML. Однак існує цілий ряд способів, за допомогою яких можна трохи послабити обмеження, що накладаються цим виразом. Перш за все, наскільки відомо, кількість прогалин між початковим символом <і дескриптором a може бути більше одиниці. Крім того, допускається наявність довільного кількості пробілів між словами a та href або між заключній подвійний лапками і правої кутової скобою. Після додавання конструкцій, що описують ці умови, все вираз приймає такий вигляд:

Код PHP // Другий чорновий варіант, в якому допускаються // додаткові пробіли $ pattern = '/ <a \ s + href = "[^"] + "\ s *> /';

Тут конструкція \ s + позначає кількість прогалин від одного і більше. Тепер введемо конструкції для обробки самого тексту анкора і заключного дескриптора </a>:

Код PHP // Третій чорновий варіант, в якому передбачається обробка // тексту і закриває дескриптора $ pattern = '/ <a \ s + href = "[^"] + "\ s *> [^>] * <\ / a > / ';

Як тексту анкора допускається використовувати будь-який текст, який займає на сторінці місце аж до заключного дескриптора анкора, тому створюється клас символів, який включає будь-які символи, крім правої кутової скобою ([^>] *), і вказує, що дані символи можуть бути присутніми в кількості від нуля і більше. Нарешті, вводиться субшаблон для зіставлення з закриває дескриптором анкора (<\ / a>).

Застосування даного шаблону цілком забезпечує обробку дескрипторів анкора в тому вигляді, який використовується в якості вихідного визначення, але забезпечує зіставлення тільки з такими анкорами, в яких ім'я дескриптора (а) і атрибут (href) задані малими літерами. Однак допускається з тим же успіхом використовувати дескриптори з великими літерами, тому додамо модифікатор i після всього висловлювання, щоб вказати на режим зіставлення без урахування регістру:

Код PHP // Четвертий чорновий варіант, який би узгодження // без урахування регістру $ pattern = '/ <a \ s + href = "[^"] + "\ s *> [^>] * <\ / a> / i ';

Цей чорновий варіант є майже повністю закінченим і може використовуватися для отримання позитивного або негативного відповіді на питання про те, чи містить сторінка посилання такого типу, який нам потрібен. Але ми зобов'язані провести додаткову роботу і отримати певні фрагменти будь-якого рядка, зіставляється з шаблоном. Для вказівки на це вводяться круглі дужки, що містять у собі ті підрядка, які нас цікавлять (в цьому виразі доданий модифікатор x, щоб екранувати пробіли в рег. Вираженні, які вводяться для його зручності читання):

Код PHP // Остаточний чорновий варіант, що забезпечує витяг подстрок $ pattern = '/ <a \s+ href=" ([^"]+) "\s*> ([^>] *) <\ / a> / ix' ;

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

Використання цього виразу в функції

Після отримання необхідного виразу для зіставлення з дескриптором анкора можна приступити до вирішення наступного завдання - написання функції, що витягає посилання з HTML-сторінки. Для цього необхідно здійснити такі дії:

  • Прийняти як параметр заданий URL.

  • Відкрити з'єднання HTTP за допомогою зазначеного URL і отримати інформаційне наповнення сторінки у вигляді рядка.

  • Виконати обробку рядка в циклі, застосовуючи розглянутий шаблон регулярного виразу і зберігаючи результати узгодження.

  • Вивести на екран всі пари витягнутих подстрок (що складаються з цільового URL і тексту анкора).

У прикладі нижче показана повна структура цільової сторінки включаючи функцію print_links ():

Проста програма пошуку посилань на PHP <! DOCTYPE HTML> <html> <head> <meta charset = "utf-8"> <title> Основи PHP </ title> <style> * {font-family: Calibri} input {padding : 8px; margin-bottom: 8px} </ style> </ head> <body> <form method = "post"> <input type = "text" name = "url" placeholder = "Введіть цільової URL"> <br> <input type = "submit" value = "Отримати посилання"> </ form> <? php function print_links ($ url) {$ fp = fopen ($ url, "r") or die ( "Неможливо відкрити файл $ url"); $ Page_contents = ""; $ Pattern = '/ <a \s+ href=" ([^"]+) "\s*> ([^>] *) <\ / a> / ix'; while ($ new_text = fread ($ fp, 100)) {$ page_contents. = $ new_text;} $ match_result = preg_match_all ($ pattern, $ page_contents, $ match_array, PREG_SET_ORDER); foreach ($ match_array as $ entry) {$ href = $ entry [1]; $ anchor = $ entry [2]; print ( "<br> <b> href </ b>: $ href; <br> <b> анкор </ b>: $ anchor <br>");}} // Обробка веб -форми (обговорюється пізніше) if (isset ($ _ POST [ 'url'])) print_links ($ _ POST [ 'url']);?> </ body> </ html>

Завдання розробки цієї функції простіше, ніж здається на перший погляд, оскільки в мові PHP вже передбачено багато її складові. Зокрема, не потрібно передбачати будь-яких особливих дій щодо створення з'єднання HTTP для завантаження веб-сторінки, оскільки функція fopen () приймає URL в якості параметра і виконує все необхідне. Тому досить після виклику функції fopen () з зазначеним в ній URL зчитувати символи до тих пір, поки надходження цих символів не припиниться, додаючи отримані дані до створюваної рядку.

Обробка в циклі вмісту HTML-сторінки забезпечується за допомогою функції preg_match_all (). У цій функції шаблон регулярного виразу застосовується максимально можливу кількість разів, після кожного використання обробка рядка починається безпосередньо слідом за тією ділянкою, де перед цим було виявлено збіг з шаблоном, і результати пошуку зберігаються в масиві $ match_array. Тут ми вирішили застосувати структуру масиву, впорядковану відповідно до прапорцем PREG_SET_ORDER. Це означає, що кожен запис в масиві верхнього рівня є частиною, що відповідає результатам конкретного узгодження з шаблоном в поточній ітерації, а не частина, отриману в результаті всіх погоджень.

На малюнку нижче показаний результат запуску цього скрипта для сайту professorweb.ru:

Пошук посилань Обробка рядків масиви Оцініті статтю:Групує елементи в єдине ціле, яке може використовуватися з символами *, +,?
Питання полягає в наступному: "Який рівень є самим верхнім?
Чи повертається масив являти собою список елементів із зазначенням позицій, кожен з яких містить список номерів послідовних погоджень, або даний масив має зворотну структуру?