Регулярни изрази (Част 3)

NICE.gif
Срещат се две планети:

- Какво ново ?

- Ами... Май съм прихванала разумен живот.
- А, дреболия, и аз съм го карала. Шест-седем хилядолетия само и отминава. Ще вдигнеш малко температура за кратко, може и повече, ако заразата стигне до термоядрена реакция. Ако се лекуваш на стадия на античността, обикновено започва ремисия. За профилактика взимам по три астероида на хилядолетие след всеки ледников период и нямам проблеми.

По-лошо от това да бъдеш сам е да бъдеш сам с някого.

Източник: Интернет


Още примери


Регулярни изрази за променливи


Програмните езици работят с променливи. Имената на някои от тях могат да съдържат само числа, букви от азбуката и знака за подчертаване (_), но не могат да започват с число:

[a-zA-Z_][a-zA-Z_0-9]* - без ограничение за дължината на стринга

Първият клас в регулярния израз ([a-zA-Z_]) определя какви символи може да съдържа първият знак (в случая- малка буква, главна буква, знака за подчертаване). Вторият ([a-zA-Z_0-9]*), който е съпроводен със звезда, определя съдържанието на останалата част от името на променливата (малки букви, главни букви, знака за подчертаване и цифрите от 0 до 9). Ако има ограничение за дължината на променливата (например до 32 знака), можете да заместите звездата с {0,31}, ако разбира се, се поддържа системата за означаване {min, max):

[a-zA-Z_][a-zA-Z_0-9]{0,31} - стринг с до 32 знака

Регулярни изрази за стринг, поставен в кавички


"[^"]*"

Кавичките в двата края търсят съвпадение с отварящите и затварящите кавички на стринга. Между тях може да има нещо друго, с изключение на други кавички. По този начин използваме класа [^"], за да имаме съвпадение с всички знаци, с изключение на двойните кавички и поставяме звездичката, за да покажем, че можем да имаме известен брой други знаци. Всъщност, в стринга е позволено да се поставят кавички, но те трябва да бъдат екранирани с обратен слаш, например: “Цитат от Айнщайн: \”Да унищожиш предразсъдъците е по-трудно,отколкото да разделиш атома на частици.\”
Има само една мааалка подробност ... аз/ти Айнщайн ли съм/си? :)

Регулярни изрази за откриване на час от денонощието


Искаме да открием “9:35 am” или “12:15 pm”.
Запис, подобен на

[0-9]?[0-9]:[0-9][0-9](am|pm)

ще открие и двете горепосочени стойности, но ще позволи и 99:99 pm.

[0-9]? - взема една от цифрите в скобите
[0-9] - взема числата от 0 до 9
[0-9]?[0-9] - числата от 0 до 99
: - разделя часа от минутите
[0-9][0-9] - числата от 0 до 99
(am|pm) - am или pm

За “12:15 pm”, първата цифра от часа трябва да е 1, но записът 1?[0-9] ще позволява и час 19 (а също така и час 0). Поради тази причина, може би е по-добре да разделим часовата част 1[012] (за двуцифрените часове) и [1-9] (за едноцифрените). Резултатът ще е групата (1[012]|[1-9]).
Частта за минутите: първата цифра ще бъде [0-5], а втората [0-9].
Когато комбинираме всичко, ще получим:

(1[012]|[1-9]):[0-5][0-9](am|pm)


Създаване на по-сложни шаблони


В по-сложните шаблони освен литерали и символи, се използват и групи, и класове.

Групи


С помощта на кръглите скоби можем да групираме познатите ни символи и да създадем по-сложни шаблони. Групирането не е сложно.
(abc) съответства точно на abc, (stupid)- само на stupid. В основата си, използването на кръгли скоби е метод за създаване на нови литерали. Ако а е литерал, на който съответства само буквата а, то (abc) е литерал, на който съответства само записа «abc» .
Записът а{3} се отъждествява със записа «ааа» , а (abc){3} с abcabcabc. Записът бон+ съответства на текст, който започва с буквосъчетанието «bon» , последвано от една или няколко букви n (например, bonnet). Записът (bon)+ съответства на стринг, който започва с буквосъчетанието bon, последвано от едно или няколко наслагвания на bon (например, bonbon). Скобите отделят и контролират група символи.

Класове


Класовете се образуват с поставяне на литералите в квадратни скоби. Например, класа на всички гласни букви, ще се запише така: [аъоуеи].
За задаване на диапазон се използва тире. Например, ако искаме да включим всички малки букви от а до z, класът ще изглежда така [а-z].
[А-Z]- която и да е главна буква от азбуката.
[A-Za-z] - която и да е буква от азбуката.
[0-9] - произволно число от 0 до 9.
[a-z]{3} - произволни три букви, например ааа, abc и др.
Карет (^), когато е извън квадратните скоби означава начало на стринг, когато обаче е вътре в квадратните скоби, служи за изключване на определен символ от групата, например записът [^a] съответства на произволен знак, с изключение на буквата а.
Записът [^0-9] задава произволен нецифров символ.
Записът [^ \^]? означава произволен знак, с изключение на caret.
В РНР има и няколко предварително определени класа, които можете да използвате при съставянето на регулярните изрази (например [:alpha:], [:digit:] и др.): Мета символи

Примерен шаблон за проверка
на електронната поща
Създадохме прост шаблон http://dreamlandpoly.blogspot.com/p/regularexpression-2.html#pattern за проверка на електронния адрес. Ще усложним малко:

$pattern =
"/([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/"


Структурата на имейл адреса е:

<потребителск име>@<име на домейна>.<тлд>

Частта за потребителското име

([_a-z0-9-]+)(\.[_a-z0-9-]+)*

може да съдържа букви от азбуката, тире, черта за подчертаване, точка и числа. Знакът + означава, че е необходим поне един от знаците, разрешени в скобите.
Частта за името на домейна

([a-z0-9-]+)(\.[a-z0-9-]+)*

следва правилата за потребителското име.
Частта за <тлд> - съкращение от "top-level domain"

(\.[a-z]{2,4})$

може да съдържа букви от азбуката, които обаче имат ограничен брой (най-малко два, а най-много – четири знака), и задължителната точка в началото, която в случая е екранирана със слаш. Знакът $ в края означава, че стрингът не може да съдържа допълнителни знаци.
С помощта на този шаблон се валидира синтаксиса на имейл адреса. Необходимо е да тестваме няколко пъти с валидни и невалидни адреси. За да направим това, ще използваме файла HandleForm_1.php (http://dreamlandpoly.blogspot.com/p/regularexpression-2.html#handle_form_1)
  1. Премахнете редовете от 27 до 37. Работете с функцията preg_match().
  2. Заместете ред 40 с шаблона, записан по-горе.
  3. Тествайте с различни имейл адреси.
Какво ще стане, ако потребителят въведе валиден имейл адрес от гледна точка на синтаксиса, но с несъществуващ домейн? Например, въвежда адреса ime@yhoo.com, вместо ime@yahoo.com?


sign.png

Няма коментари:

Публикуване на коментар