Наскільки великий і різноманітний світ інформації,настільки ж стрімко він розширюється і розвивається. Будь-яке рішення - всього лише момент в загальному процесі руху. Знання і досвід дають можливість розуміти процес досягнення мети, але ніколи - не результат її досягнення. Сумнівно, що в доступному для огляду майбутньому взагалі можна говорити про результат, але дуже важливо, що процес прагнення до нього представляє істотний і об'єктивно-необхідний процес.
«Бажання і / або великі гроші» не створюютьалгоритм, здатний на те, що природно і «безкоштовно» робить людина, особливо коли він не замислюється над тим, що саме він робить. У всякому положенні інформаційної завдання є як мінімум одну білу пляму, але за ним, зазвичай відразу, видно інші чисті плями, і зовсім не обов'язково, що всі вони білих кольорів.
Інтернет технології суттєво спростили доступдо інформації, але питання - як накласти на наявне бажане - не спростила, а придбав нові «обсяги» робіт. І хоча на PHP регулярні вирази пробіл явно не вичерпають, вони є суттєвий крок вперед.
Прості функції + алгоритм = шаблон
Пропонуючи регулярні вирази, PHP істотнозменшує вміст алгоритму, але звичайні функції пошуку / заміни і алгоритми обробки знайденого не втратили свого значення. Нові ідеї не віщують інформаційну революцію. Максимум, на який можна розраховувати - компактний код і зростання вміння розробника правильно формулювати пошуковий запит.
Слід знати і застосовувати на PHP регулярнівираження. Приклади переконливі і ефективні. Але слід усвідомлювати, що з появою нового механізму пошуку центр тяжіння перемістився в шаблон - своєрідний механізм, хоча по суті замінюючи безліч простих функцій пошуку, умов, циклів, інших операторів.
мати:
- якісний і сучасний інструмент - це добре;
- бачити і використовувати досвід колег це важливо;
- поєднувати реальну дійсність і віртуальні ідеї - гарантія успіху.
Досягнення знання, як треба було розуміти завдання, щоб її вирішити, частіше має більше значення, ніж конкретний результат.
Регулярні вирази в PHP представленідекількома функціями в синтаксисі мови і безліччю корисних прикладів в інтернеті. Зважаючи на специфіку синтаксису мови варіанти застосування обмежені тільки уявою розробника, однак слеует мати на увазі, що далеко не всі шаблони будуть працювати. Засобами PHP перевірка регулярних виразів має істотне значення.
Простий пошук символу (рядки)
Символ - це не завжди один байт, і часто символ,як елементарний сигнал, несе точний сенс додатково. Кодування визначає видимі символи в коді по різному. Символ може мати кілька варіантів: "$" = "USD" = "у.о.", ... - це точний сенс, що десь щось, але не обов'язково поруч, пов'язане з валютою. Однак точний зміст може лежати і в змінної PHP, яка завжди починається з символу "$", але не може починатися з "USD" і "у.о.".
У програмах символом може бути ім'я функції(Рядок) в контексті: розпізнати і виконати - це з області динамічного об'єктно-орієнтованого програмування, коли конструкції, функції, регулярні вирази PHP використовуються безпосередньо для прийняття рішень. Знайдений символ «виповнюється», тобто сам собою визначає, що потрібно робити в тому місці, в якому він знайдений, і так, як він це «сам вважатиме» за потрібне.
Шукати просто символ / рядок - не така простазаняття, і чим більше в символі інформації, тим краще. Не завжди потрібно знайти десяток кращих цін на продукти харчування, вибрати смачні рецепти святкового торта або визначитися з підрядником на навісну стелю.
Часто доводиться оптимізувати прості алгоритмиз не простий інформаційної арифметикою або в складних умовах, коли шуканий символ потрібно вибрати з бази даних, а рядок, в якій його слід знайти, - в сотні сайтів. При цьому ціна вибору символу дорівнює часу вибірки з бази даних, а ціна того, де шукати - часу пошуку горезвісної сотні сайтів.
Одинокий символ - це не фраза і не кілька фраз, він може перебувати де завгодно і бути як завгодно малим. Як визначити, що саме знайдене є шукане?
Приклад: пошук ціни
Просто знайти в тексті символ "$" - мало.Перевірити, що перед ним стоїть цифра, теж не завжди достатньо. Якщо передбачити точку або цифру перед символом "$", це гарантія, що ціни, у яких грошові символи стоять попереду, не будуть враховані. Будуть також пропущені ціни, в яких взагалі не вказана грошова одиниця, але на сторінці є на неї явне вказівку.
Загалом, рішення поставленого завдання звичайним чином роздує алгоритм до невпізнання і займе багато часу. Тим часом, використовуючи регулярний вираз, число PHP знайде без проблем.
$ CContents = preg_match_all ( "/ [0-9] + ([$] | usd | у.о. | уе) {1} / i";
"Look e-mail - 2usd; <br/>";
"Find e-mail - 2у.е .; <br/>";
"Work e-mail - уе2; <br/>";
"Check e-mail - $ 13", $ aResult);
. ";". implode ( ",", $ aResult [0]). "<br/>".
Дасть відповідь: "2; 2usd, 2у.е.", Але не знайде нічого в рядку: "check e-mail - $ 13".
Передбачивши в шаблоні наявність символу спереду або ззаду, можна швидко досягти мети в переважній більшості випадків.
$ CContents = preg_match_all ( "/ ([0-9] + ([$] | usd | у.о. | уе) {1}) | (([$] | usd | у.о. | уе) {1 } [0-9] +) / i ";
"Look e-mail - 2usd; <br/>";
"Find e-mail - 2у.е .; <br/>";
"Work e-mail - уе2; <br/>";
"Check e-mail - $ 13", $ aResult);
. ";". implode ( ",", $ aResult [0]). "<br/>".
Результат: "4; 2usd, 2у.е., уе2, $ 13".
Про непередбачуваної логіці
Регулярні вирази PHP пропонує, як і іншіінструментальні засоби, але зовсім не обов'язково їх застосовувати за його правилами або використовувати інші малі функції передбаченим синтаксисом чином.
Можна перед початком пошуку перетворити шукане вмасив, а місце, де буде здійснено пошук, розбити на складові за попередньою критерієм. Проста пара функцій explode () і implode () часто спрощує і прискорює рішення.
Наприклад, в результаті попередніх робітсформований масив рядків (даних) по району про те, скільки картоплі зібрала кожне село: зазначено ІмяДеревня і зібраний обсяг, а якщо в селі працює кілька підприємств, то в рядок масиву йде ІмяДеревня.ІмяПредпріятіе і значення через ";" і так по всіх підприємствах. Порахувати загальний обсяг зібраного в даному випадку буде неможливо, але якщо зробити impode ( ";", $ aResult), буде одна довга рядок, в якій пари - ІмяДеревня / ІмяДеревня.ІмяПредпріятіе - зібраний обсяг - будуть перераховані через ";". Зробивши зворотне на отриманому, explode ( ";", $ aResult) - масив всіх, хто збирав і скільки він зібрав, потім, видаливши з рядків все нецифрові символи, маємо тільки цифри, сума яких і буде загальним обсягом зібраного.
В даному прикладі регулярні вирази на 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). "<br/>";
$ CContents. = Preg_match ( "/ asdf $ /", "asdf", $ aResult). ";". implode ( ",", $ aResult). "<br/>".
Результат буде: 1; asdf1; asdf.
Символи "^" і "$" вказують, з чого починаєтьсяшаблон і чим закінчується. Результат функції preg_match - кількість збігів, воно може бути 0, 1 або false, якщо виявлена помилка. У третій параметр - масив - поміщається єдиний знайдений елемент. У разі використання функції preg_match_all () пошук триває до кінця рядка.
$ CContents = preg_match ( "/ asdf / i", "asdf123asdf456asdf789", $ aResult). ";". implode ( ",", $ aResult). "<br/>";
$ CContents. = Preg_match_all ( "/ asdf / i", "asdf123asdf456asdf789", $ aResult). ";". implode ( ",", $ aResult [0]). "<br/>".
результат:
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 (квадратні дужки емулюють дужки тегів).
Зібрати воєдино інформацію можна легко післякожного процесу редагування завдання, але кожен раз ця процедура буде виконуватися по різному алгоритму. Регулярні вирази, як свого роду інструмент формалізації інформаційних завдань, стали, по суті, стежкою від формальних гіпертекстових структур до природної інформації.