Проверка валидности входящей строки.

Уроки по PHP, Javascript и т.п.
Ответить
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Проверка валидности входящей строки.

Сообщение Nick Lisogor »

Проверка валидности входящей строки.

Сегодня я расскажу о работе со строками, а именно, о проверке валидности входящей строки.

Ситуация.

Приведу конкретную ситуацию. Допустим, у нас есть сервер, на который пользователи загружают фотографии групп, в которых они находятся в данный момент. К сожалению, пользователей стало слишком много и на диске сервера начало заканчиваться место. Они начали искать другое решение и заметили, что каждое изображение группы после загрузки имеет свою уникальную ссылку:

Изображение

Изображение

После чего разработчики проекта решили сэкономить место на сервере, изменив добавления изображения на указание ссылки к нему. Немного подумав, они также обратили внимание на то, что для того, чтобы сократить время модерации, сервер сам должен проверять находится ли ссылка на изображение в пределах vkontakte.ru. Ведь, в противном случае, изображения по ссылке можно будет заменять n раз и модератор не будет успевать проверять их. Именно это толкнуло их на создание фильтра ссылок.

Логика.

Просмотрев на несколько таких изображений, я заметил сходство всех ссылок на них, они имели следующий общий вид:

Код: Выделить всё

'http://cs' + [число]{минимум одно} + '.vkontakte.ru' или '.vk.com' + '/g' + [число]{минимум одно} + '/a_' + [число или символы a-z(нижнего регистра)]{минимум одно} + '.jpg'
Для понимания того, что будет описано ниже, нужно, хотя бы малейшее знание "Регулярных выражений"(RegExp) [http://ru.wikipedia.org/wiki/Регулярные_выражения] .

Практическая часть(PHP).

Немного подумав, я составил алгоритм, который должен был выполнять скрипт:
- Получение входящей строки;
- Проверка строки на содержание домена vkontakte.ru или vk.com;
- Проверка строки на соответствие шаблону ссылки.

Рассмотрим второй и третий пункты. Для того, чтобы проверить строку на содержание домена, нам достаточно следующего регулярного выражения:

Код: Выделить всё

"/домен\.ру/"
1. Для проверки полного соответствия шаблону ссылки нужно более сложное выражение, распишу все по порядку:

1.1. Изначально, выражение имеет следующий вид(где ^ и $ обозначают строгое начало и конец выражения) :
1.2. Строка в любом случае начениется на 'http://cs' :

Код: Выделить всё

"http\:\/\/cs"
1.3. После 'http://cs' идет номер сервера, т.е. [число от 0 до 9]{минимум одно} :

Код: Выделить всё

"[0-9]{1,}"
1.4. Затем идет доменное имя '.vkontakte.ru' или '.vk.com', благодаря проверке на содержание домена выше, нужно будет подставить лишь один домен, к примеру:

Код: Выделить всё

"\.vkontakte\.ru"
1.5. Затем идет строка '/g' :
1.6. Повторяется пункт 1.3;

1.7. Затем идет строка '/a_' :
1.8. После строки выше идет число, которое может иметь в себе и символы латинского алфавита нижнего регистра и цифры(от 0 до 9) :

Код: Выделить всё

"[a-z0-9]{1,}"
1.9. В конце ссылки находится её формат, а именно '.jpg' :
2. Код, демонстрирующий алгоритм:

Код: Выделить всё

<?php/*** @Author: Nick Lisogor, special for flapps.ru*/ //Входящая ссылка$test_string = (String)$_POST['link']; //Валидные домены$aviable_hosts = array("vkontakte\.ru", "vk\.com"); for((int)$i = 0; $i < count($aviable_hosts); $i ++){    /**    * Если во входящей строке была найдена фраза "vkontakte.ru" или "vk.com"    */    if((int)preg_match("/".$aviable_hosts[$i]."/", $test_string, $maches) > 0)    {        echo "В строке была найдена фраза " . stripslashes($aviable_hosts[$i]) . "<br>";                /**        * Если строка имеет шаблон:        * 'http://cs' + [число]{минимум одно} + '.vkontakte.ru' или '.vk.com' + '/g' + [число]{минимум одно} + '/a_' + [число или символы a-z(нижнего регистра)]{минимум один} + '.jpg'        */        $image_url_template = "/^http\:\/\/cs[0-9]{1,}\.".$aviable_hosts[$i]."\/g[0-9]{1,}\/a_[a-z0-9]{1,}\.jpg$/";        if(preg_match($image_url_template, $test_string, $maches) > 0)        {            echo "Строка польностью подходит по параметрам.<br>";        }        else        {            echo "Строка не подходит по шаблону.";        }                break;    }}?>
Послесловие.

Подобные системы часто используются в проверке email и других входящих данных.

Полезные статьи:
Автор: Nick Lisogor, специально для Flapps.ru, копипаст запрещен.
Noise Gate
Сообщения: 691
Зарегистрирован: 28 апр 2010, 12:34

Re: Проверка валидности входящей строки.

Сообщение Noise Gate »

Все это дело можно заменить на одну регулярку...
Не проверял, но вроде все должно быть ок...
разделил скобками некоторые части, чтобы было нагляднее

Код: Выделить всё

 ^http\:\/\/(cs\d+)\.(vkontakte\.ru|vk\.com)\/(g\d+)\/(a_[a-z0-9]+)\.jpg$ 
, где:
+ - повторение один или более раз
\d - число

и лучше всего, на всякий случай, это делать в режиме, не чувствительном к регистру
Ответить