Все для создания и продвижения сайтов

Верстка, программирование, SEO

Регулярные выражения в php

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

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

/^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$/

Синтаксис

В наиболее простом виде РВ выглядит таким образом:

abc

Оно соответствует всем строкам, имеющим подстроку "abc".

Выражение в квадратных скобках отличается тем, что скобки ограничивают поиск содержащимися в них символами:

[abc]

Данному РВ соответствуют строки, которые содержат abc – как по отдельности, так и вместе. Содержащееся в скобках выражение также носит название бра-кет выражения.

В том случае, если необходимо создать РВ, которое будет соответствовать буквам русского алфавита, можно или осуществить их перечисление в РВ (занимает много времени и сил) или записать его таким образом:

[а-Я]

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

[а-яА-Я]

РВ, которые соответствуют числам, можно задать таким же способом:

[0-9]

или

[0123456789]

Данные выражения равнозначны и соответствуют каждой цифре.

Групповой символ

Создавая РВ, воспользуйтесь групповым символом «.». Он осуществляет объединение пары одиночных символов (кроме \n):

.ок

Данное выражение также соответствует таким строкам, как «док», «кок», «ток».

Выражение

x.[0-9]

соответствует той строке, которая содержит символ х (за ним должны идти цифры от 0 до 9 и те или иные символы). Данному критерию удовлетворяют такие строки, как, например, «xz1», «xl2».

Ветви

РВ может содержать некоторое количество ветвей, разделяющихся символом |. Он действует в роли оператора ИЛИ (OR). При использовании в выражении ветвей одна из них должна соответствовать строке "abc|абв".

Данному РВ соответствуют строки, которые содержат подстроки - «абв» или «abc». Обычно ветвление используется для того, чтобы проверить зоны доменов, имен и расширений файлов. Нижеприведенное РВ осуществляет проверку на наличие в строке подстрок «net», «com» и «ru».

ru|com|net

Исключающее выражение

Чтобы исключить из поиска определенную последовательность символов, перед ней необходимо наличие символа «^».

[^а-я]

Данное РВ отвечает символам, не имеющимся в диапазоне а-я. Символ ^ обладает значением «не» только в том случае, если он расположен внутри квадратных скобок. В противном случае он получит другое значение, о котором мы расскажем ниже.

Квалификаторы

Для уточнения РВ вы можете воспользоваться квалификаторами — такими символами, как *, ? +. Они указывают на количество последовательностей символов в строке. Их необходимо указать после части выражения, в которой вам необходимо их использовать:

  • “а*” - 0 или > a (данному выражению соответствуют строки «укр», «абв» и «абва»);
  • ''a?'' - 0 или 1 а (данному выражению соответствуют строки «укр» и «абв», не соответствуют - «абва»);
  • ''a+'' - наличие минимум одного а (данному выражению соответствуют строки «абв» и «абва», не соответствует - «укр»).

Границы

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

  • ''xy{2}'' соответствуют той строке, где два y следуют за x;
  • ''xy{2,}'' - той, где за х идут от двух y;
  • ''xy{2,6}'' – где за x идет 2-6 y. 

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

  • "x(yz){2,6}" соответствует той строке, где за x идет 2-6 последовательностей yz;
  • "x(yz)*" - в которой за x идут последовательности y в количестве 0 и более.

Подвыражения

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

(морская)*волна

Данное выражение соответствует таким строкам, как "волна", "морская волна" и проч.

Соответствие началу и концу строки

В РВ вы можете указать, где должно находиться то или иное подвыражение: или и в начале, и в конце, или в начале или конце строки. Началу строки соответствует специальный символ ^:

''^xy''

Подобное выражение соответствует начинающимся с xy строкам. Символ ^ необходимо вынести за пределы выражения:

^[a-z]"

Концу строки соответствует символ $:

xy$

Данное РВ соответствует оканчивающимся на xy строкам.

Сопоставление со специальными символами

Если необходимо сопоставить выражение строке, имеющей специальные символы ({, ^, $) перед ними необходимо поставить черту \. Если вы напишете в РВ ''\$'', то в строке будет найден символ $.

Если перед символом имеется обратная косая черта, то это свидетельствует о том, что для записи символа была использована escape-последовательность.

Это же можно отнести  и к символу косой черты. Для сопоставления с этим символом необходимо написать две черты - \\.

Классы символов

Классами символов представляют собой сокращенные названия, предназначенные для предопределенных символов. Перечислим данные классы и символы:

  • [[:alnum:]]- буквенно-цифровые;
  • [[:digit:]]- десятичные цифровые;
  • [[:xdigit:]]- шестнадцатеричные цифровые;
  • [[:alpha:]]- буквенные;
  • [[:upper:]]- прописные буквенные;
  • [[:lower:]]- строчные буквенные;
  • [[:punct:]]- знаки пунктуации
  • [[:space:]]- пробел;
  • [[:blanc:]]- табуляция и пробел;
  • [[:print:]]- печатные;
  • [[:cntrl:]]- управляющие;
  • [[:graph:]]- печатные символы (кроме пробелов).

В РВ классы символов используются наравне с остальными символами:

  • "[a-zA-Z_0-9]" эквивалентно "[[:alnum:]]";
  • "[0-9]" эквивалентно "[[:digit:]]";
  • "[a-Z]" эквивалентно РВ "[[:alpha:]]".

Функции для работы с регулярными выражениями

В PHP есть поддержка 2 типов записи РВ — POSIX и Perl. POSIX (Portable Operating System Interface) представляет собой интерфейс переносной операционной системы и стандарт для интерфейсов приложений. Сейчас мы рассмотрим РВ POSIX и Perl-совместимые РВ.

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

ereg()

bool ereg(string pattern, string string [, array regs])

Эта функция осуществляет поиск соответствия РВ в строке string, который задан в шаблоне pattern. В случае наличия соответствий шаблона с подвыражениями их сохранят в массиве соответствий regs. В $regs[0] имеется копия строки string, а в $regs[1] находится подстрока, которая начинается с первой левой скобки. Подстрока со второй левой скобки хранится в $regs[2] и т. д.

Рассмотрим код, который из формата YYYY-MM-DD преобразовывает формат даты в  DD.MM.YYYY.

<? $date = "2015-03-21";
if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)){
        echo "$regs[3].$regs[2].$regs[1]";
    }
    else{
        echo "Неверный формат даты: $date";
    }
?>

ereg_replace()

string ereg_replace(string pattern, string replacement, string string)

Данная функция меняет шаблон pattern, который был обнаружен в строке string, на строку replacement. При наличии соответствия происходит осуществление модифицированной строки.

Будьте внимательны: указание числа как типа, который отличен от строкового, является ошибкой — число должно всегда указываться как строка.

<? 
$number = "1952";
$str = "Он родился в пятьдесят втором.";
echo("до замены:$str");
$str = ereg_replace("пятьдесят втором", $number, $str);
echo("<br> после замены: $str");
?>

Результат:

до замены: Он родился в пятьдесят втором.после замены: Он родился в 1952.

eregi()

bool eregi (string pattern, string string[, array regs])

Данная функция аналогична ereg. Отличие состоит в том, что регистр игнорируется.

eregi_replace()

string eregi_replace (string pattern, string replacement, string string)

Отличие данной функции от ereg_replace состоит в том, что она не является чувствительной к регистру.

split()

array split (string pattern, string string [, int limit])

Данная функция проводит возвращение массива строк из подстрок строк string, которые были образованы в соответствии с РВ pattern в ходе разделения строки string на подстроки. При указании параметра limit (он не является обязательным) возвращаемый массив будет иметь до limit элементов, причем в последнем имеется неразделенная часть строки.

Данная функция окажет пользу при разделении доменных имен, дат и проч. Например:

<? 
$url = "www.softtime.ru";
$array = split ("\.", $url); 
foreach($array as $index => $val) {
    echo("$index -> $val <br />");  
}?>

В результате будет следующее:

0 -> www 1 -> softtime 2 -> ru

Это же можно осуществить и с датой:

<?
$date = "10-12-2003"
$array = split ("-", $date);
foreach($array as $index => $val){
    echo("$index -> $val <br />");
}
?>

В результате мы получим:

0 -> 10 1 -> 12 2 -> 2015

spliti()

array spliti (string pattern, string string [, int limit])

Данная функция похожа на split, однако не является чувствительной к регистру.

Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.