создание и разработка веб-сайтов
поисковая оптимизация и реклама
статьи о программировании и веб-дизайне

Ссылки по теме:
 

Кухня php: готовим регулярные выражения (часть 1)

Сегодня мы рассмотрим очень важную и незаменимую возможность языков программирования — это работа с регулярными выражениями, которые позволяют значительно облегчить задачу манипуляции с текстовыми данными. Однако поначалу, людям не знакомым с такими выражениями они могут показаться чем-то непонятным и очень сложным. Такой эффект связан с довольно сложным синтаксисом записи регулярных выражений, изобилующих спецсимволами и поначалу непрозрачными конструкциями.


Итак, регулярные выражения — это специальные конструкции (последовательность символов), с помощью которых можно из текста выделить слово или набор слов, соответствующих некоторому заданному шаблону. Например, разберем задачу, в которой нам надо изменить расширение файла с file.txt на file.php. Стандартными средствами PHP это можно сделать примерно так:

<?php $fileName = 'file.txt'; /* Находим позицию точки в имени файла */ $pointPos = strpos($fileName,'.'); /* Считываем подстроку до точки в новую переменную */ $fileNew = substr($fileName,0,$pointPos); /* Добавляем расширение файла */ $fileNew .= ".php"; ?> В принципе, стандартными средствами php данная операция по замене разрешения файла делается как мы убедились довольно просто в три строчки. Есть стандартная функция php, которая позволяет сделать ту же самую операцию в одну строчку с помощью str_replace(): <?php $fileName = 'file.txt'; /* заменяем расширения при помощи функции str_replace() */ $fileNew = str_replace('txt','php',$fileName); ?> Действительно в данном случае требуемая операция выполняется всего за один шаг. Однако мы рассмотрели довольно простые замены, в более сложных случаях приведенные выше подходы не всегда применимы, т.е. конечно можно обойтись и стандартными средствами языка, но при этом придется городить сложные конструкции, в то время как с помощью записи регулярных выражений php можно обойтись всего одной строкой.

Теперь давайте посмотрим как мы можем решить приведенную выше задачу другим способом при помощи PCRE (Perl Compatible Regular Expression или перл-совместимое регулярное выражение):

<?php $fileName = 'file.txt'; $fileNew = preg_replace('/\..+/si','.php',$fileName); ?> В данном случае функция preg_replace() заменяет последовательность символов из переменной $fileName, совпавшую с выражением '/\..+/si' на строку '.php'. Причем в последнем случае мы получили некоторое преимущество по сравнению с предыдущими способами, мы оказались не привязаны к расширению файла .txt. Т.е. окажись на месте файла file.txt другой файл с расширением например .dat или .js, он также был бы заменен на файл с расширением .php, благодаря строке регулярного выражения. Таким образом, строка '/\..+/si' позволяет находить в имени файла его расширение. Шаблон поиска в данном случае очень прост: он заключается в парные вертикальные или наклонные слэши, или фигурные скобки, внутри которых и располагается само выражение для поиска совпадений. Внутри слэшей «\.» обозначает символ точки, а «.+» — последовательность любых символов. Стоящие в конце «si» означают однострочный поиск и игнорирование регистра символов соответственно. Следовательно данное регулярное выражение говорит нам о том, что мы хотим выделить во входящей строке все, что находится после точки (включая точку) причем обрабатываем мы только одну строку и не обращаем внимание на регистр символов (т.е. нам не важно строчные или прописные буквы содержит имя файла).

Почему же для того, чтобы найти точку нам пришлось написать целых два символа «\.» (точка предваренная обратным слешем)?

Да все потому, что в регулярных выражениях точка является спецсимволом и может быть любым символом, а для того, чтобы специальные символы обозначали то, что должны обозначать, их предваряют обратным слешем. А вот в конструкции «.+» — точка как раз и обозначает любой символ, а плюс говорит о том, что таких символов может быть сколько угодно.

Классы символов PCRE: \s — соответствует символам пробела (" "), табуляции (\t), переноса строки (\n) или возврата каретки (\r); \S — соответствует любому НЕпробельному символу; \w — любая буква или цифра; \W — не буква и не цифра; \d — цифра в диапазоне от 0-9; \D — все кроме цыфры;

Также группу символов можно задать и в явном виде в квадратных скобках, например аналог \d можно записать ввиде [0-9], \w — [a-zA-Z], любые буквы, цифры и подчеркивание — [a-zA-Z0-9_] и т.д.

Квантификаторы повторений: + — знак плюс, обозначает одно или более совпадений (с ним мы уже познакомились в примере); * — звездочка, обозначает ноль или более совпадений; ? — знак вопроса, обозначает ноль или одно, но не более, совпадений; {min,max} — не менее min (число) и не более max (число) совпадений, скобки фигурные; Мнимые символы PCRE: ^ — соответствует началу строки, а также отрицанию символа; $ — соответствует концу строки; \b — соответсвует началу или окончанию слова; \B — любая позиция не соответствующая началу или концу слова;

В следующей части мы поговорим о том, как проверить правильность ввода e-mail-адреса и некоторых других особенностях регулярных выражений.




20 апреля 2009