Рейтинг@Mail.ru
 





Шаг 1


Знакомство

Мы уже сталкивались с регулярными выражениями, когда (если) делали систему регистрации. Настало время копнуть поглубже.

Итак, что это такое.
Регулярные выражения (regex или regular expressions) представляют собой мощный и очень гибкий мини-язык, созданный для поиска подстрок в строке по заданным параметрам. Они являются неотъемлемой частью большинства основных языков программирования (PHP, Perl, JavaScript, Python, Ruby).
В этом разделе мы будем рассматривать только один из этих языков, это PHP.


Регулярки, это поистине сказочное явление, результат работы которых просто повергает в шок.
Часто можно услышать такое - я с регулярками не дружу. Это примерно тоже самое, что валить лес ножовкой и говорить - я с бензопилой не дружу. На самом деле это совсем не сложно, главное понять принцип и выучить немногословный синтаксис.

Попробуем.

И так, что они могут, эти регэкспы.
• Проверять, соответствует ли вся строка целиком заданным параметрам.
• Находить в строке подстроки, которые удовлетворяют заданные параметры.
• Получить из строки подстроки, соответствующие заданным параметрам.
• Изменять в строке подстроки, соответствующие параметрам.
• И еще кучу всего интересного.

Нужно сразу определиться с терминологией, которая используется при работе.

1. Строка - весь набор символов, переданный для разбора.
2. Подстрока – это символ или определенная последовательность символов, или часть строки.
3. Заданные параметры - то есть то, что нам надо найти, где искать, на что заменить и т. д.
4. Дальше будут попадаться и другие, по ходу движения все объясним.

Ну а теперь вкусное - пример.

Возьмем самый простой вариант, который часто применяется для валидации логинов.




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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

    
function checkData($str)
    {
 
        
$standart = array('a''b''c''d''e''f''g''h''i''j''k''l''m'
                          
'n''o''p''q''r''s''t''u''v''w''x''y''z',
                          
'а''б''в''г''д''е''ё''ж''з''и''й''к''л',
                          
'м''н''о''п''р''с''т''у''ф''х''ц''ч''щ',
                          
'ъ''ы''ь''э''ю''я''0''1''2''3''4''5''6',
                          
'7''8''9'
                          
);
                  
                  
    
mb_internal_encoding('utf-8');      
    
$str mb_strtolower($str);  
    
$cnt mb_strlen($str);   
  
    for(
$i 0$i $cnt $i++)  
       if(!
in_array(mb_substr($str$i1), $standart))
           return 
false
           
    return 
true;
    }
    
   
$login 'עִבְרִית';
    
    if(
checkData($login))
        echo 
'Пойдет';    
    else
        echo 
'Лазутчики!';


Мало того, что она громоздкая и запутаная, так еще и заставляет PHP решать несвойственные ему задачи. Делать посимвольный анализ на нем можно только в крайних случаях.
А с помощью регулярных выражений эта задача решается коротенькой строчкой:
1
2
3
4
5
6
7
8
9
<?php

   $login 
'Дормидонт';
    
    if(!
preg_match('#^[a-zа-яё0-9]+$#ui'$login))
        echo 
'Лазутчики!';     
    else
        echo 
'Пойдет';


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

Такой символ (^ - циркумфлекс или крышка) означает, что проверка будет от начала строки, ($ - доллар) означает конец строки. Если не ставить привязки к началу и концу строки, то регулярное выражение будет применимо к любой подстроке, и вот такой логин логинְרִית будет признан кошерным. ))

Так же границы регулярного выражения - должны как-то выделяться. В данном случае они выделены "шарпом", символом решетки, т.е. #. Во многих учебниках границы задаются слэшами /. Это то же верно, но если, вдруг, в регулярном выражении необходимо будет использовать слэши, то их придется экранировать. И по этому рекомендуется использовать максимально нейтральные границы, такие как # ну или &. Но мы будет использовать #, потому что она выглядит красивее.

Меду этими символами идет так называемый паттерн. То есть шаблон, на который будет ориентироваться программа, осуществляя поиск совподений.
В нашем случае это диапазоны символов от a до z (латинский алфавит) , от a до я плюс ё (кирилица) и от 0 до 9 (цифры).
То, что это помещено в квадратные скобки, и обозначает диапазон. Или класс. Обратите особое внимание на то, что буква ё не входит в диапазон а - я, так уж исторически сложилось. По этому нужно подставлять её отдельно.

Дальше идет плюсик. Это количество символов в подстроке. Если стоит плюс, то значит, что хотя бы один символ из указанного диапазона в строке быть обязан. Если звездочка - то может и не быть такого. Если цифра в фигурных скобках - значит именно такое количество символов должно идти подряд. Если диапазон, то от и до соответственно.

Буква u после границы шаблона(модификатор) означает, что мы будем работать с символами в кодировке (UTF-8), а i значит, что регистр символов не имеет значения, то – есть в верхнем, или в нижнем, или вперемешку будут символы, не важно. Есть еще куча модификаторов, которые помогают управлять процессом.

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

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


Артем aka Winston