Регулярні вирази (PHP). PHP: регулярні вирази, приклади

201 0 Новини високих технологій

Наскільки великий і різноманітний світ інформації, настільки ж стрімко він розширюється та розвивається. Будь-яке рішення - всього лише момент в загальному процесі руху. Знання і досвід дають можливість розуміти процес досягнення мети, але ніколи - не результат її досягнення. Сумнівно, що в найближчому майбутньому взагалі можна говорити про результат, але дуже важливо, що процес прагнення до нього представляє істотний і об'єктивно-необхідний процес. «Бажання і/або великі гроші» не створюють алгоритм, здатний на те, що природно і «безкоштовно» робить людина, особливо коли він не замислюється над тим, що саме він робить. У всякому положенні інформаційної завдання є як мінімум одна біла пляма, але за ним, зазвичай відразу, видно інші чисті плями, і зовсім не обов'язково, що всі вони білих квітів.


Регулярні вирази (PHP). PHP: регулярні вирази, приклади
Інтернет технології істотно спростили доступ до інформації, але питання - як накласти на наявне бажане - не спростився, а придбав нові «обсяги робіт. І хоча PHP регулярні вирази пробіл явно не вичерпають, вони є істотний крок вперед.

Прості функції + алгоритм = шаблон

Пропонуючи регулярні вирази, PHP істотно зменшує вміст алгоритму, але звичайні функції пошуку/заміни і алгоритми обробки знайденого не втратили свого значення. Нові ідеї не віщують інформаційну революцію. Максимум, на що можна розраховувати - компактний код і зростання вміння розробника правильно формулювати пошуковий запит.
Регулярні вирази (PHP). PHP: регулярні вирази, приклади
Слід знати і застосовувати на PHP регулярні вирази. Переконливі приклади і ефективні. Але слід усвідомлювати, що з появою нового механізму пошуку центр ваги перемістився в шаблон - своєрідний механізм, хоча по суті замінює безліч простих функцій пошуку, умов, циклів, інших операторів.


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

    Простий пошук символу (рядки)

    Символ - це не завжди один байт, і часто символ, як елементарний сигнал, несе точний сенс додатково. Кодування визначає видимі символи в коді по різному. Символ може мати кілька варіантів: "$" = "USD" =".е.", - це точний сенс, що десь щось, але не обов'язково поруч, пов'язане з валютою. Однак точний сенс може лежати і в змінної PHP, яка завжди починається з символу "$", але не може починатися з "USD" і "в".е.".
    Регулярні вирази (PHP). PHP: регулярні вирази, приклади
    У програмах символом може бути ім'я функції (рядок) в контексті: розпізнати і виконати - це з області динамічного об'єктно-орієнтованого програмування, коли конструкції, функції, регулярні вирази використовуються PHP безпосередньо для прийняття рішень. Знайдений символ «виконується», тобто сам собою визначає, що потрібно робити в тому місці, в якому він знайдений, і так, як він це «сам вважатиме» потрібним.
    Шукати просто символ/рядок - не таке просте заняття, і чим більше в символі інформації, тим краще. Не завжди потрібно знайти десяток кращих цін на продукти харчування, вибрати смачні рецепти святкового торта або визначитися з підрядником на навісну стелю.
    Регулярні вирази (PHP). PHP: регулярні вирази, приклади
    Часто доводиться оптимізувати прості алгоритми не простий інформаційної арифметикою або в складних умовах, коли шуканий символ потрібно вибрати з бази даних, а рядок, в якій його слід знайти, - у сотні сайтів. При цьому ціна вибору символу дорівнює часу вибірки з бази даних, а ціна того, де шукати – часу пошуку горезвісної сотні сайтів. Самотній символ - це не фраза і не кілька фраз, він може перебувати де завгодно і бути як завгодно малим. Як визначити, що саме знайдене є шукане?

    Приклад: пошук ціни

    Просто знайти в тексті символ "$" - мало. Перевірити, що перед ним стоїть цифра, теж не завжди достатньо. Якщо передбачити точку або цифру перед символом "$", це гарантія, що ціни, у яких грошові символи стоять попереду, не будуть враховані. Будуть також пропущені ціни, в яких взагалі не вказана грошова одиниця, але на сторінці є на неї вказівка.
    Регулярні вирази (PHP). PHP: регулярні вирази, приклади
    Загалом, рішення поставленої задачі звичайним чином роздує алгоритм до невпізнання і займе багато часу. Між тим, використовуючи регулярний вираз, число PHP знайде без проблем. $cContents = preg_match_all("/[0-9]+([$]|usd|у.е.|уе){1}/i"; "look e-mail - 2usd; ";
    "find e-mail - 2у.е.; ";
    "work e-mail - уе2; ";
    "check e-mail - $13", $aResult);
    . '; ' . implode(',', $aResult[0]) . ' '. Дасть відповідь: "2; 2usd,2у.е.", але не знайде нічого в рядку: "check e-mail - $13". Передбачивши в шаблоні наявність символу спереду або ззаду, можна швидко досягти мети в переважній більшості випадків. $cContents = preg_match_all("/([0-9]+([$]|usd|у.е.|уе){1})|(([$]|usd|у.е.|уе){1}[0-9]+)/i";
    "look e-mail - 2usd; ";
    "find e-mail - 2у.е.; ";
    "work e-mail - уе2; ";
    "check e-mail - $13", $aResult);
    . '; ' . implode(',', $aResult[0]) . ' '.
    Результат: "4; 2usd,2у.е.,уе2$13".

    Про непередбаченої логіці

    Регулярні вирази PHP пропонує, як і інші інструментальні засоби, але зовсім не обов'язково їх застосовувати за його правилами або використовувати інші рядкові функції передбаченим синтаксисом чином. Перед початком пошуку перетворити шукане в масив, а місце, де буде здійснено пошук, розбити на складові за попереднім критерієм. Проста пара функцій explode() і implode() часто спрощує і прискорює рішення.
    Регулярні вирази (PHP). PHP: регулярні вирази, приклади
    Наприклад, у результаті попередніх робіт сформований масив рядків (даних) по району про те, скільки картоплі зібрала кожна село: зазначено ИмяДеревня і зібраний обсяг, а якщо в селі працює кілька підприємств, то в рядок масиву йде ИмяДеревня.ИмяПредприятие і значення через ";" і так по всім підприємствам. Порахувати загальний обсяг зібраного в даному випадку не представиться можливим, але якщо зробити impode(";", $aResult), буде одна довга рядок, у якому пари - ИмяДеревня/ИмяДеревня.ИмяПредприятие – зібраний обсяг - будуть перераховані через ";". Зробивши зворотне здобутий, explode(";", $aResult) - масив всіх, хто збирав і скільки він зібрав, потім, видаливши з рядків всі нецифровие символи, маємо тільки цифри, сума яких і буде загальним обсягом зібраного. В даному прикладі регулярні вирази на PHP дозволяють зовсім не шукати зайве, вони просто і доступно витягують потрібні цифрові значення. Швидко і ефективно, якими б довгими були імена сіл і підприємств. Це рішення не ідеал, але воно показує, що далеко не завжди слід дотримуватися правилами. Часто можна досягти бажаного незвичайним чином.

    Абстрагуючись від технічної сторони, від кодування

    Синтаксис алгоритму не говорить про те, як він виглядає насправді. Але, забезпечивши однакову кодування сторінки, скрипта і рядків (яка шукається і в якій відбувається пошук), можна зануритися в завдання поза її технічної сторони.
    Регулярні вирази (PHP). PHP: регулярні вирази, приклади
    Потрібно не тільки знати, що шукати, але і де це робити, коли, в якій кількості, на що міняти і яким чином. Формально регулярні вирази PHP виконані як закінчений власний повнофункціональний механізм, однак з багатьох причин реалізація його аналогів в різних мовах відрізняється. За загальним правилом, перш ніж переносити той чи інший шаблон в ту чи іншу інструментальну середовище для розв'язання конкретної задачі, необхідно провести якісну адаптацію, виконати перевірку на всіх можливих варіантах вихідних даних.
    Регулярні вирази (PHP). PHP: регулярні вирази, приклади
    Навіть якщо використовується власний досвід розробки на PHP, регулярні вирази, приклади, шаблони і конструкції вимагають пильної перевірки. Динамічно змінюється функціонал мови, синтаксис і середовище виконання.

    Структура і зміст шаблону

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

    Приклад простого вираження

    У простому варіанті шаблон співпадає з рядком: $cContents = preg_match("/asdf/i", "asdf", $aResult) . '; ' . implode(',', $aResult). Результат буде "1; asdf", оскільки функція закінчує свою роботу на першому ж встреченном збігу шаблону. Результат буде таким же, якщо шукати в рядку "aaaasdf" і в рядку "zzzasdfvvv". Якщо вказати перший та/або останній символ, то підсумок буде однозначним: $cContents = preg_match("/^asdf/i", "asdf", $aResult) . '; ' . implode(',', $aResult) . ' ';
    $cContents .= preg_match("/asdf$/", "asdf", $aResult) . '; ' . implode(',', $aResult) . ' '. Результат буде:1; asdf1; asdf. Символи "^" і "$" вказують, з чого починається шаблон і чим закінчується. Результат функції preg_match – кількість збігів, воно може бути 0 1 або false, якщо виявлена помилка. У третій параметр – масив - поміщається єдиний знайдений елемент. У разі використання функції preg_match_all() пошук триває до кінця рядка. $cContents = preg_match("/asdf/i", "asdf123asdf456asdf789", $aResult) . '; ' . implode(',', $aResult) . ' ';
    $cContents .= preg_match_all("/asdf/i", "asdf123asdf456asdf789", $aResult) . '; ' . implode(',', $aResult[0]) . ' '. Результат: 1; asdf
    3; asdf,asdf,asdf. Якщо не використовувати спеціальних вказівок, то кожен символ визначає себе і своє місце, незалежно від кодування рядка і кодування шаблону. Програміст зобов'язаний подбати, щоб кодування цих елементів були коректними по відношенню один до одного і кодуванні сторінці.

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

    Регулярні вирази на PHP являють собою рядки символів, записані певним чином. Зазвичай, за аналогією з іншими мовами програмування, вони записуються в символах "/" "/" і поміщаються в лапки, в залежності від алгоритму можна використовувати одинарні і подвійні. Основна функція php preg match регулярні вирази використовує як збіг шаблону і зупиняється при першому його перебування, її варіант з суфіксом _all шукає всі збіги і видає масив таких. Функція preg replace виробляє заміну кожного знайденого збігу шаблону, вона може працювати з масивами, дозволяючи проектувати пошук і виконувати заміну по безлічі варіантів. Цікаві варіанти роботи з регулярними виразами можна розробити за допомогою функції preg_replace_callback, яка не приймає текст для заміни, а ім'я функції, яка буде виконувати таку заміну. Крім практичного значення тут можна реалізувати механізми перевірки шаблонів, що в розробці та налагодженні останніх відіграє істотну роль.

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

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

    Регулярні вирази і реальна інформація

    Важлива область застосування регулярних виразів на PHP сформована появою бібліотек PHPOffice. Робота з документами і електронними таблицями завжди мала і має важливе значення, а стандарт OOXML дозволив не тільки розбирати реальні документи, але і формувати їх програмно. Завдяки розвитку мов розмітки і PHP зокрема, з'явилася реальна можливість автоматизувати "виробництво" документів "стандартної форми", наприклад, рахунків на оплату, звітів, бізнес-планів та інших інформаційних об'єктів, структура і вміст яких реально піддається формалізації і автоматизації. У зв'язку із застосуванням для опису мови OOXML процес розробки регулярних виразів має суттєві відмінності від традиційної роботи з мовами розмітки HTML і CSS в першу чергу. Реальний документ, крім розмітки і крім власне контенту має безліч деталей. Наприклад, документ, створений автоматично програмою, буде мати суворе і точне зміст. Документ, сформований людиною, чи ним оброблений, буде мати зміст, розписане по безлічі тегів. Будь-яка робота з документом призводить до того, що семантика його може залишатися одна, але розписаної всередині по різному кількістю різних конструкцій.

    Природна інформація і ситуація

    Людину завжди цікавить рішення задачі, постановка якої є інформація і, у результаті, буде надана також інформація. Представивши постановку задачі у вигляді документа, людина отримує певну семантику, яка в ході уточнення фахівцями (внесення змін, уточнення формулювань, видалення, редагування) призводить не тільки до безлічі варіантів одного документа, але і до його версіями з різним вмістом. Зокрема, задача, поставлена фразою "Вирішити квадратно уранение", після редагування не буде виглядати так: "Розв'язати квадратне рівняння". Якщо була виправлена спочатку перша помилка, а потім друга, то природна інформація в стилі OOXML може мати вигляд: "[Решить] [] [квадратно] [е] [] [ура] [в] [нение]", але це зовсім не гарантія, що саме так завдання буде виглядати в тегах OOXML (квадратні дужки емулюють дужки тегів). Зібрати воєдино інформацію можна легко після кожного процесу редагування завдання, але кожен раз ця процедура буде виконуватися по різному алгоритмом. Регулярні вирази, як свого роду інструмент формалізації інформаційних завдань, стали, по суті, стежкою від формальних гіпертекстових структур до природної інформації.