Проверка валидности входящей строки.
Добавлено: 17 мар 2011, 00:16
Проверка валидности входящей строки.
Сегодня я расскажу о работе со строками, а именно, о проверке валидности входящей строки.
Ситуация.
Приведу конкретную ситуацию. Допустим, у нас есть сервер, на который пользователи загружают фотографии групп, в которых они находятся в данный момент. К сожалению, пользователей стало слишком много и на диске сервера начало заканчиваться место. Они начали искать другое решение и заметили, что каждое изображение группы после загрузки имеет свою уникальную ссылку:
После чего разработчики проекта решили сэкономить место на сервере, изменив добавления изображения на указание ссылки к нему. Немного подумав, они также обратили внимание на то, что для того, чтобы сократить время модерации, сервер сам должен проверять находится ли ссылка на изображение в пределах vkontakte.ru. Ведь, в противном случае, изображения по ссылке можно будет заменять n раз и модератор не будет успевать проверять их. Именно это толкнуло их на создание фильтра ссылок.
Логика.
Просмотрев на несколько таких изображений, я заметил сходство всех ссылок на них, они имели следующий общий вид:
Для понимания того, что будет описано ниже, нужно, хотя бы малейшее знание "Регулярных выражений"(RegExp) [http://ru.wikipedia.org/wiki/Регулярные_выражения] .
Практическая часть(PHP).
Немного подумав, я составил алгоритм, который должен был выполнять скрипт:
- Получение входящей строки;
- Проверка строки на содержание домена vkontakte.ru или vk.com;
- Проверка строки на соответствие шаблону ссылки.
Рассмотрим второй и третий пункты. Для того, чтобы проверить строку на содержание домена, нам достаточно следующего регулярного выражения:
1. Для проверки полного соответствия шаблону ссылки нужно более сложное выражение, распишу все по порядку:
1.1. Изначально, выражение имеет следующий вид(где ^ и $ обозначают строгое начало и конец выражения) :
1.2. Строка в любом случае начениется на 'http://cs' :
1.3. После 'http://cs' идет номер сервера, т.е. [число от 0 до 9]{минимум одно} :
1.4. Затем идет доменное имя '.vkontakte.ru' или '.vk.com', благодаря проверке на содержание домена выше, нужно будет подставить лишь один домен, к примеру:
1.5. Затем идет строка '/g' :
1.6. Повторяется пункт 1.3;
1.7. Затем идет строка '/a_' :
1.8. После строки выше идет число, которое может иметь в себе и символы латинского алфавита нижнего регистра и цифры(от 0 до 9) :
1.9. В конце ссылки находится её формат, а именно '.jpg' :
2. Код, демонстрирующий алгоритм:
Послесловие.
Подобные системы часто используются в проверке email и других входящих данных.
Полезные статьи:
Автор: Nick Lisogor, специально для Flapps.ru, копипаст запрещен.
Сегодня я расскажу о работе со строками, а именно, о проверке валидности входящей строки.
Ситуация.
Приведу конкретную ситуацию. Допустим, у нас есть сервер, на который пользователи загружают фотографии групп, в которых они находятся в данный момент. К сожалению, пользователей стало слишком много и на диске сервера начало заканчиваться место. Они начали искать другое решение и заметили, что каждое изображение группы после загрузки имеет свою уникальную ссылку:
После чего разработчики проекта решили сэкономить место на сервере, изменив добавления изображения на указание ссылки к нему. Немного подумав, они также обратили внимание на то, что для того, чтобы сократить время модерации, сервер сам должен проверять находится ли ссылка на изображение в пределах vkontakte.ru. Ведь, в противном случае, изображения по ссылке можно будет заменять n раз и модератор не будет успевать проверять их. Именно это толкнуло их на создание фильтра ссылок.
Логика.
Просмотрев на несколько таких изображений, я заметил сходство всех ссылок на них, они имели следующий общий вид:
Код: Выделить всё
'http://cs' + [число]{минимум одно} + '.vkontakte.ru' или '.vk.com' + '/g' + [число]{минимум одно} + '/a_' + [число или символы a-z(нижнего регистра)]{минимум одно} + '.jpg'
Практическая часть(PHP).
Немного подумав, я составил алгоритм, который должен был выполнять скрипт:
- Получение входящей строки;
- Проверка строки на содержание домена vkontakte.ru или vk.com;
- Проверка строки на соответствие шаблону ссылки.
Рассмотрим второй и третий пункты. Для того, чтобы проверить строку на содержание домена, нам достаточно следующего регулярного выражения:
Код: Выделить всё
"/домен\.ру/"
1.1. Изначально, выражение имеет следующий вид(где ^ и $ обозначают строгое начало и конец выражения) :
Код: Выделить всё
"/^$/"
Код: Выделить всё
"http\:\/\/cs"
Код: Выделить всё
"[0-9]{1,}"
Код: Выделить всё
"\.vkontakte\.ru"
Код: Выделить всё
"\/g"
1.7. Затем идет строка '/a_' :
Код: Выделить всё
"\/a_"
Код: Выделить всё
"[a-z0-9]{1,}"
Код: Выделить всё
"\.jpg"
Код: Выделить всё
<?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, копипаст запрещен.