RegExp: перетворення URL в посилання
Воістину, немає меж глибині і ширині простого, на перший погляд, проекту «Відповідей» (нині покійних). Розпочавшись на рівні гри, з розміщення звичайного html-файлу, зробленого на коліні вручну, - до бази даних і, потім, до повністю автоматизованої паспортної системи імпорту через RSS. Саморобний Гугль, типу.
Подальше обговорення призначене для людей, знайомих хоча б в загальних рисах з регулярними виразами і програмуванням, з проблемами, що стоять перед веб-розробниками.
Здається, я переконав читачів в тому, що очевидні, прості, корисні і само-собою зрозумілі речі іноді не працюють. Не працюють навіть там, де, здавалося б, повинні і навіть зобов'язані працювати.
Перейдемо тепер до викладу нашого рішення даної проблеми. Воно просто, як все геніальне :) Сподіваємося, кому-то буде корисно якщо не пройти разом з нами всі сходинки до вирішення, то хоча б скористатися готовим результатом.
Отже, збираємо текст, який буде містити в собі всі вищенаведені труднощі. Єдині обмеження: рядок не повинна мати повернень каретки \ n або \ r \ n, а
або
замість них (буде потрібно дуже незначне ускладнення - зробіть самостійно), знаків дюйма «" »і апострофів« ' »(це спецсимволи, які впливають на безпеку веб-сторінок і повинні бути перетворені в html-суті для зберігання в базі даних або перед виведенням на сторінку) 1.
Спробуємо тепер скласти регулярний вираз, справляється з подібними труднощами. Але спочатку перерахуємо ці труднощі - напишемо формальну постановку задачі.
Всього-то! Почнемо, мабуть.
У PHP для роботи з регулярними виразами використовується, в тому числі, функція preg_replace ($ pattern, $ replacement, $ text) - саме вона нам і потрібна для вирішення завдання. Почнемо з першого аргументу - власне, самого виразу.
1. За п. 1 умови задачі, вираз має працювати з символами Юнікоду. Модифікатор u служить цій меті (хоча, на сторінках з відмінними від UTF-8 кодуваннями, воно, навпаки, працювати перестане - тоді цей модифікатор краще буде прибрати); i теж не завадить, щоб зробити вираз регістронезавісімого. (Примітка: при використанні модифікатора x (PCRE_EXTENDED) слід прогалини випередити зворотним слешем «\»).
Ось так: / вираз / iu. де «вираз» - ненароджені ще регулярний вираз, заготівля.
Далі може йти будь-яка послідовність літер, цифр і символів крім пробілу або початку тега «<», обеспечиваемая с помощью выражения в квадратных скобках [^<\s]+ — знак плюс означает, что повторений таких символов должно быть больше нуля. Итого получаем, суммируя: http:\/\/[^<\s]+
Звичайно, це не все. Якщо обмежитися отриманим - http: \ / \ / [^<\s]+[^<. ;?!”»’“+\-\)] — выражение в первых квадратных скобках захватит и знак препинания в конце, а во вторых скобках — пробел. Надо нам это? Нет, не для этого деды воевали.
Значить, потрібен обмежувач. Цим обмежувачем буде [. ;?! "» ' "+ \ - \)]? (?:
) * \ S Складно? Розберемо на частини. У квадратних дужках - набір знаків пунктуації (його можна розширювати за смаком), на одному з яких і повинен спіткнутися біг пошукової машини з попереднього абзацу. (?:
) * Показує, що може кілька разів зустрітися
4 або
, а може і не зустрітися. Крім того, вміст круглих дужок не слід поміщати в «кишеню» - для цього використана конструкція (?: Підвираз) - про це трохи нижче. Важливо: після зустрінутого (або не зустрінутого - зверніть увагу на знак питання після закриває квадратної дужки; до речі, замість «?» Можна поставити зірочку «*», якщо передбачається кілька знаків поспіль - на кшталт «.», - в текстах таке зустрічається досить часто ) розділового знака і можливих тегів розриву рядків йде обов'язковий пробіл.
Залишилося зрозуміти, на що міняємо шило. Мило виглядає так:
$ Replacement = '$ 1$ 2 ';
Остаточно, помістимо все господарство в функцію PHP, що працює з регулярними виразами:
preg_replace ($ pattern, $ replacement, $ text);
Ну, або, що те ж саме, але виглядає більш громіздко:
Бажаємо успіхів в проектуванні сайтів!