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

Уроки по PHP, Javascript и т.п.

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

Сообщение Nick Lisogor » 17 мар 2011, 00:16

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

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

Ситуация.

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

Изображение

Изображение

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

Логика.

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

  1. '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' :



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. Код, демонстрирующий алгоритм:

  1. <?php
  2. /**
  3. * @Author: Nick Lisogor, special for flapps.ru
  4. */
  5.  
  6. //Входящая ссылка
  7. $test_string = (String)$_POST['link'];
  8.  
  9. //Валидные домены
  10. $aviable_hosts = array("vkontakte\.ru", "vk\.com");
  11.  
  12. for((int)$i = 0; $i < count($aviable_hosts); $i ++)
  13. {
  14.     /**
  15.     * Если во входящей строке была найдена фраза "vkontakte.ru" или "vk.com"
  16.     */
  17.     if((int)preg_match("/".$aviable_hosts[$i]."/", $test_string, $maches) > 0)
  18.     {
  19.         echo "В строке была найдена фраза " . stripslashes($aviable_hosts[$i]) . "<br>";
  20.        
  21.         /**
  22.         * Если строка имеет шаблон:
  23.         * 'http://cs' + [число]{минимум одно} + '.vkontakte.ru' или '.vk.com' + '/g' + [число]{минимум одно} + '/a_' + [число или символы a-z(нижнего регистра)]{минимум один} + '.jpg'
  24.         */
  25.         $image_url_template = "/^http\:\/\/cs[0-9]{1,}\.".$aviable_hosts[$i]."\/g[0-9]{1,}\/a_[a-z0-9]{1,}\.jpg$/";
  26.         if(preg_match($image_url_template, $test_string, $maches) > 0)
  27.         {
  28.             echo "Строка польностью подходит по параметрам.<br>";
  29.         }
  30.         else
  31.         {
  32.             echo "Строка не подходит по шаблону.";
  33.         }
  34.        
  35.         break;
  36.     }
  37. }
  38. ?>


Послесловие.

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

Полезные статьи:



Автор: Nick Lisogor, специально для Flapps.ru, копипаст запрещен.
Услуги клиент-сервер(оптимальные цены)
Работаю с PHP, ActionScript 3, JavaScript.

За это сообщение автора Nick Lisogor поблагодарили - 3:
Александр, Noise Gate, 112
Nick Lisogor
FL Team
FL Team
 
Автор темы
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08
Благодарил (а): 10 раз.
Поблагодарили: 9 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



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

Сообщение Noise Gate » 28 мар 2011, 11:45

Все это дело можно заменить на одну регулярку...
Не проверял, но вроде все должно быть ок...
разделил скобками некоторые части, чтобы было нагляднее
  1.  ^http\:\/\/(cs\d+)\.(vkontakte\.ru|vk\.com)\/(g\d+)\/(a_[a-z0-9]+)\.jpg

, где:
+ - повторение один или более раз
\d - число

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

 
Сообщения: 691
Зарегистрирован: 28 апр 2010, 12:34
Откуда: СПб
Благодарил (а): 31 раз.
Поблагодарили: 64 раз.


Вернуться в Уроки на другие темы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0