Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Веб-программирование > PHP / MySQL

PHP / MySQL Создание динамических Веб-ресурсов

Ответ
 
Опции темы
Старый 04.11.2011, 19:23   #1
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,076
Написано 2,293 полезных сообщений
(для 6,403 пользователей)
Готовим регулярные выражения: Проверка строки по шаблону

Вечер добрый, мои дорогие пекари.
Сегодня я решил окунуть вас с головой в такую часто вызывающую у многих головную боль тему как "Регулярные выражения".
Кто не в курсе эта такой особый способ работы с текстом. И применений ему масса. И эту массу для наполнения ваших булочек мы сегодня будем разбирать по составу :B

Сегодня мы будем проверять строку по шаблону.

Вам понадобится:
Онлайн тестер регулярных выражений
http://www.functions-online.com/preg_match.html
Как юзать под оффтопом:

subject - наш вводимый текст
pattern - наше выражение
flags и offset пока не трогаем.

В результате выполнения нас пока что интересует только result.
Он булевой:
1 - строка валидна
0 - строка не валидна


Или использовать вот такое на своём веб сервере:
<?
$pattern 
= (isset($_POST['pattern'])) ? $_POST['pattern'] : '';
$subject = (isset($_POST['subject'])) ? $_POST['subject'] : '';
$pattern stripslashes($pattern);
$subject stripslashes($subject);
?>
<hr />
<form action ="" method="post">
    Pattern:
    <input style="width: 370px; padding: 5px;" name="pattern" type="text" value="<?= $pattern?>" /><br />
    Subject:
    <textarea style="width: 370px; padding: 5px;" cols="20" rows="10" name="subject"><?= $subject?></textarea>
    <input type="submit" value="Выполнить" />
</form>

<?= (@preg_match($pattern$subject)) ? 'Да' 'Неа'?>



И так - без вступительных речей.
Начнём по мужски сразу в лоб:
/^http(s?):\/\/[a-z0-9-.]+(:[0-9]+)?(\/(.*))?$/i
Да это же похоже на:
私の馬を見て、私の馬は素晴らしいです!

Первое, что бросается в глаза это http. Угу, значит речь идёт об URL.

Для начала давайте подумаем из чего же состоит URL и каких видов они бывают.
* Нас на данный момент интересуют только http.

Стандартный вид:
http://domain.tld/dir/script.ext

Тоже самое но с добавлением защищённого(http) соединения:
https://domain.tld/dir/script.ext

Так же в URL может быть указан порт вот таким образом:
https://domain.tld:7777/dir/script.ext

Давайте пометим части цветами:

https://domain.tld:7777/dir/script.ext

И легенда.
¦ - префикс "s" для зашифрованного соединения (не обязателен)
¦ - доменное имя
¦ - порт (не обязателен)
¦ - путь после домена (не обязателен)

Ну что, господа, уже представили себе как это реализовывать на всяких такм strpos substr и тд? Сложно, да? А на регулярках это займёт 1 строку.

Давайте продумаем алгоритм.
1) Проверка есть ли в начале http если нет, то стоп.
2) Существует ли приставка "s" к http? Есть - оставляем, нет - фиг с ним едем дальше.
3) Введён ли домен используя сиволы a-z 0-9 точка и дефиз(русские домены пока не берём) есть? идём дальше - иначе стоп.
4) Введён ли порт? Начинается с ":" и далее только цифры 0-9 и их сколько угодно (на самом деле нет, но мы же только начинаем).
5) Есть "/"? Если да то пофигу и если нет тоже :D Но проверить надо дабы понять где кончается домен а где там начинается путь.

Теперь к делу - собираем регулярку!
Стройка начинается с сортира, а регулярка с границ выражения.

Сообщение от Регулярочка
/^...$/
/ - управляющий символ. Им обрамляется всё выражение целиком.
^ - старт строки.
$ - конец строки.

Дальше прямым текстом пишем что в начале строки должен быть http:

Сообщение от Регулярочка
/^http$/
Через такое выражение пройдёт только фраза "http".

Общие понятия по под-выражениям и диапазонам/наборам символов:
[...] - диапазон или набор символов.
Например:
[a-z] - 1 символ, который может принимать значения от a до z
[0-9] - 1 символ, который может принимать значения от 0 до 9
[0-9a-z] - 1 символ, который может принимать значения от 0 до 9 или от a до z
[0-9a-zA-Z] - 1 символ, либо любая буква англ. алфавита либо любая 1 цифра
[ab12] - 1 символ, который может принимать значения a,b,1,2 но никакие другие

Диапазон в развёрнутом виде и с 1 вариантом пишется без скобок, хотя никто не запрещает писать в скобках например так:
[a][s][s]

Для указания любого произвольного символа используется точка "."
Это делается так "[.]" или проще так "."
Например:
[.о.о.] под него подпадут слова "солод", "молод"

Так же мы можем указывать для таких диапазонов количество вхождений:
[а] - 1 буква "а"
[а]+ - 1 и более буква "a"
[a]* - сколько угодно "а" и нисколько тоже
[а]{3} - 3 буквы "а"
[а]{3,} - 3 и более букв "а"
[а]{1, 12} - от 1 до 12 букв "а"

Получается, что:
[a]* эквивалентен [a]{0,}
[a]+ эквивалентен [a]{1,}
[a]? эквивалентен [a]{0,1}


() - подвыражение. Нужно для группирования наборов символов внутри основного выражения.
Например:
([a-z][A-Z][0-9]) - говорит о том что тут 3 символа буква в нижнем регистре, буква в верхнем, цифра
Так же такие подвыражения будут возвращены в результат ф-ции ($matches)

Флаги для выражений или диапазонов (ставить после):
+ - выражение может повторяться от 1 до скольки угодно раз
? - это выражение может отсутствовать (т.е. если нет такого вхождения то нет)
{число} - это выражение повторяется указаное число раз. Так же можно указать диапазон например {2-3}
* - это выражение повторяется сколько угодно раз и может не быть вовсе


Теперь добавим первое условие - наличие "s"
(..)-подвыражение
? - флаг внутри выражения, говорящий о том что соблюдение не обязательно

Сообщение от Регулярочка
/^http(s?)$/
Тут уже пройдёт "http" и "https".
Теперь нам надо добавить "://" если c ":" всё в порядке, то с символом / уже нет - он управляющий! Его надо экранировать.
Это делается так: "\/\/" что равнозначно: "//"

Сообщение от Регулярочка
/^http(s?):\/\/$/
Далее домен: Буквы от a-z цифры 0-9, тире и точка и их в общей сложности может быть сколько угодно.
[a-z0-9-.]+

Сообщение от Регулярочка
/^http(s?):\/\/[a-z0-9-.]+$/
Символ плюса на конце диапазона говорит что выражение может повторяться от 1 до скольки угодно раз.
Теперь ссылки вида:
http://boolean.name
https://boolean.name
https://boo.le-an.na-me
Пройдут проверки. Слеш на конце, кстати, обломает проверку ведь его нигде не ждут :B

Теперь порт. В начала уже знакомый нам ":" потом некоторое кол-во цифр:
(:[0-9]+)?
Разберём скобку.
( - начало подвыражения
: - нужный для порта символ двоеточия
[0-9] - этот диапазон символов, в данном случае нас интересуют только цифры
+ - Указывает количество вхождений - сколько угодно раз, но не меньше 1го символа
) - конец подвыражения
? - это подвыражение не обязательно

Сообщение от Регулярочка
/^http(s?):\/\/[a-z0-9-.]+(:[0-9]+)?$/
Отлично! Теперь у нас спокойно пролезают:
https://domain.tld:8080
http://dom-ain.tld
https://domain.gov.ua.tld:113

Теперь завершающий этап - всё что после слеша:

(
\/ - наш заветный слеш
(.*) - всё что угодно (даже ничего) и сколько угодно
)? - всё подвыражение не обязательно

Сообщение от Регулярочка
/^http(s?):\/\/[a-z0-9-.]+(:[0-9]+)?(\/(.*))?$/
Теперь через наше выражение пройдёт уже почти любой url:

http://domain.tld/newthread.php?do=postthread
https://domain.tld/newthread.php?do=postthread
http://domain.tld:80/newthread.php?do=postthread

Осталось пофиксить последний изъян. Наше выражение чувствительно к регистру. Это легко исправить добавив в самый конец глобальный флажок i.
Вот так:
Сообщение от Регулярочка
/^http(s?):\/\/[a-z0-9-.]+(:[0-9]+)?(\/(.*))?$/i
Вот и всё.

Чего не хватает:
1) Проверки что в домене есть хотя бы одна буква кроме точки или тире
2) Лимит на количество цифр в порте.


Спасибо вам за уделённое время и удачных экспериментов. Если дело пойдёт - будет вам вторая часть.
__________________
Retry, Abort, Ignore? █
Пека: AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti

Последний раз редактировалось Randomize, 14.08.2014 в 11:12.
(Offline)
 
Ответить с цитированием
Эти 21 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
.Squid (04.11.2011), ABTOMAT (04.11.2011), baton4ik (04.11.2011), den (05.11.2011), Лис (21.02.2015), Halk-DS (02.10.2013), Harter (24.03.2013), impersonalis (04.11.2011), L.D.M.T. (05.11.2011), Leo_ind (27.01.2012), moka (04.11.2011), Mr_F_ (27.06.2012), Nerd (06.04.2014), pax (04.11.2011), Reks888 (04.11.2011), SBJoker (04.11.2011), St_AnGer (05.11.2011), Tadeus (27.06.2012), treycerok (13.04.2012), VotapilD (05.11.2011), Черный крыс (15.08.2013)
Старый 04.11.2011, 19:56   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,266
Написано 5,130 полезных сообщений
(для 14,835 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Я всё понял! Хороший урок.
Look at my horse, my horse is amazing!
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (04.11.2011)
Старый 04.11.2011, 19:57   #3
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Легко читаемая и понятная мини-статья, спасибо.

私の馬を見て、私の馬は素晴らしいです!
http://www.youtube.com/watch?v=_RjMSWhGWak


/^http(s?)://$/ 
Далее домен: Буквы от a-z цифры 0-9, тире и точка и их в общей сложности может быть сколько угодно.
[a-z0-9-.]+
Тут, очевидно, имелось в виду /^http(s?):\/\/$/ ?

Последний раз редактировалось baton4ik, 04.11.2011 в 22:01.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (04.11.2011)
Старый 04.11.2011, 20:06   #4
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,076
Написано 2,293 полезных сообщений
(для 6,403 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Сообщение от baton4ik Посмотреть сообщение
Легко читаемая и понятная мини-статья, спасибо.
Тут, очевидно, имелось в виду /^http(s?):\/\/ ?
Ой! Булочный тег [ php] навёл марафет.
__________________
Retry, Abort, Ignore? █
Пека: AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 05.11.2011, 11:26   #5
VotapilD
Оператор ЭВМ
 
Регистрация: 06.12.2009
Адрес: Мытищи
Сообщений: 42
Написано 6 полезных сообщений
(для 6 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Наконец-то я увидел правильный порядок разбора *_* Спасибо, а то. когда нужно было - путался постоянно =(
Лошадь и вправду прекрасна %)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (05.11.2011)
Старый 05.11.2011, 20:33   #6
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,076
Написано 2,293 полезных сообщений
(для 6,403 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Принимаются предложения тем для следующей статейки.
__________________
Retry, Abort, Ignore? █
Пека: AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 05.11.2011, 20:42   #7
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,427
Написано 3,452 полезных сообщений
(для 6,856 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

JSON
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (05.11.2011)
Старый 05.11.2011, 20:50   #8
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 05.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,641 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Сообщение от MoKa Посмотреть сообщение
JSON
Я, честно говоря, не знаю, что о нем можно написать. Вроде как очень простой формат (не путать с "не функциональный") - из Википедии можно все понять.
Но если будет хорошая статья, то я за.
__________________

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
ABTOMAT (05.11.2011), moka (05.11.2011)
Старый 05.11.2011, 21:30   #9
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,427
Написано 3,452 полезных сообщений
(для 6,856 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Многие не совсем понимают его плюсов. И используют частенько совсем не по назначению.

Если статью направить на описание плюсов в использовании например с точки зрения скорости разработки, и удобства, используя серверную часть на PHP или даже собственный (WebSockets протокола), то статья имеет потенциал.

Сейчас сильно развивается направление WebSockets, а как мы знаем, юзается JavaScript, и JSON в данном случае - готовое решение для сериализации.
Рассмотрение этого формата с этой точки зрения, потенциально.

Формат простой, и для тех кто смышлённый, статьи не нужны. А те кто читает статьи, нуждается в разъяснениях, это отличный момент, когда можно качественно "промыть" и направить мышление у начинающих..
(Offline)
 
Ответить с цитированием
Старый 05.11.2011, 22:12   #10
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 05.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,641 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Ну тогда я бы на месте автора привел несколько примеров использования вне веб-разработки. Для геймдева этот формат имхо лучше, чем XML. И не только для хранения конфигураций, но и даже для текстовых форматов медии. Ребята из bitsquid его нахваливают.
__________________

(Offline)
 
Ответить с цитированием
Старый 05.11.2011, 22:16   #11
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,427
Написано 3,452 полезных сообщений
(для 6,856 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Есть даже NoSQL базы данных, построенные на подобных структурах: ключ : значение, а не таблицах..
(Offline)
 
Ответить с цитированием
Старый 27.06.2012, 01:17   #12
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,266
Написано 5,130 полезных сообщений
(для 14,835 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Только что эта статья спасла мою жопу на работе.
Ещё раз респект!
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
moka (27.06.2012), SBJoker (27.06.2012)
Старый 14.03.2013, 15:34   #13
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Радость Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Есть такое выражение:
^([0-9а-z]+)$

использую в htaccess таким образом:
RewriteEngine On
RewriteRule ^([0-9а-z]+)$ page.php?go=$1 [L]

в общем все, что совпадает с этим выражением передается в виде GET-запроса странице pаge.php

Вопрос: как сделать обратную этому функцию? То есть чтобы все остальное попадало на другую страницу.

З.Ы. я так понял в регулярках нет такой вещи как NOT или я ошибаюсь?
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Старый 14.03.2013, 16:22   #14
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,076
Написано 2,293 полезных сообщений
(для 6,403 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

Сообщение от 2Fake Посмотреть сообщение
Есть такое выражение:
^([0-9а-z]+)$

использую в htaccess таким образом:
RewriteEngine On
RewriteRule ^([0-9а-z]+)$ page.php?go=$1 [L]

в общем все, что совпадает с этим выражением передается в виде GET-запроса странице pаge.php

Вопрос: как сделать обратную этому функцию? То есть чтобы все остальное попадало на другую страницу.

З.Ы. я так понял в регулярках нет такой вещи как NOT или я ошибаюсь?
Используй отрицания:
RewriteRule ^([^0-9^a-z]+)$ other.php?go=$1 [L]

^0-9 - не цифры
^a-z - не буквы
^sosiska - не сосиска
__________________
Retry, Abort, Ignore? █
Пека: AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Trazzy (14.03.2013)
Старый 14.03.2013, 17:59   #15
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Готовим регулярные выражения: Проверка строки по шаблону

То что надо.
Thnx! (особенно за сосиску)
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (15.03.2013)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 13:12.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com