Статьи

Использование регулярных выражений в PHP

Когда я впервые начал программировать на PHP, я обнаружил, что регулярные выражения очень сложны. Они были сложными, выглядели безобразно, их было трудно понять, и в этой области, казалось, действительно отсутствовала документация. Эта статья даст вам представление о том, что они из себя представляют, как они полезны и как их применять.

Что такое регулярные выражения?

Регулярные выражения начинались как особенность оболочки Unix. Они были разработаны для облегчения поиска, замены и работы со строками — и с момента их изобретения они широко используются во многих различных частях операционных систем на основе Unix. Они широко использовались в Perl, и с тех пор были внедрены в PHP.

Для чего я могу их использовать?

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

Вы также можете использовать их для выполнения сложных операций поиска и замены в данном тексте, что было бы невозможно с помощью стандартной функции PHP str_replace . Да, возможности безграничны!

Как я могу их использовать?

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

В PHP есть два типа функций регулярных выражений:

  • функции ereg — стандартный синтаксис регулярных выражений PHP
  • функции preg , использующие Perl-совместимый синтаксис регулярных выражений

    Для этой статьи мы будем использовать функцию eregi . Функция eregi используется для сопоставления строки с определенным регулярным выражением. « i » в имени функции означает «без ereg регистра» — вы также можете использовать « ereg если хотите, чтобы оно ereg регистр.

    Вы можете увидеть страницы руководства по PHP для функции eregi здесь .

    Теперь, как вы знаете, адреса электронной почты всегда имеют определенный формат:

    имя пользователя @ домен. расширение

    Это делает их идеальным кандидатом для проверки с помощью регулярного выражения. Итак, давайте посмотрим на выражение, которое я написал, чтобы проверить правильность адреса электронной почты. Мы рассмотрим каждый раздел выражения по отдельности, а затем я включу ссылку на синтаксис в конце статьи. Но сначала вот само выражение:

     eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]  +.[a-zA-Z.]{2,5}$', $email) 

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

     ^[a-zA-Z0-9._-]+@ 

    Эта часть выражения проверяет раздел «имя пользователя» адреса электронной почты. Знак шляпы ( ^ ) в начале выражения представляет начало строки. Если бы мы не включили это, то кто-то мог ввести все, что хотел, до адреса электронной почты, и он все равно подтвердил бы.

    В квадратных скобках содержатся символы, которые мы хотим разрешить в этой части адреса. Здесь мы разрешаем буквы az, AZ, цифры 0-9 и символы подчеркивания ( _ ), точки ( . ) И тире ( - ). Как вы, наверное, заметили, я включил буквы как заглавными, так и строчными. В этом случае это не является строго необходимым, так как мы используем функцию eregi (без учета регистра). Но я включил их здесь для полноты и чтобы показать вам, как работают функции. Порядок пар символов в скобках не имеет значения.

    Знак плюс ( + ) после квадратных скобок указывает «одно или несколько значений из предыдущих скобок». Таким образом, в этом случае мы требуем, чтобы один или несколько символов в квадратных скобках были включены в адрес для его проверки. Наконец, есть знак « @ », что означает, что нам требуется наличие одного знака @ сразу после имени пользователя.

     [a-zA-Z0-9._-]+. 

    Эта часть выражения очень похожа на раздел, который мы рассмотрели. Он проверяет доменное имя в адресе электронной почты. Как и прежде, у нас есть ряд символов в квадратных скобках, которые мы разрешим в этой части адреса, после которых добавляется знак плюс ( + ), требующий один или несколько из этих символов.

    В конце этого раздела есть обратный слеш, затем знак периода. Это говорит выражению, что в этой точке в выражении требуется точка (т. Е. Между доменом и расширением). Однако обратная косая черта немного сложнее. В регулярном выражении точка на самом деле означает «любой символ». Чтобы это выражение принимало буквальное значение периода, а не использовало его в качестве подстановочного знака для любого символа, нам нужно «экранировать» его — это делается путем предваряющего периода обратной косой черты. Возможно, вы уже сталкивались с этим раньше, если используете базы данных, такие как MySQL, поскольку экранирование символов также очень важно.

     [a-zA-Z]{2,4}$ 

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

    Вместо знака « + мы использовали ранее, здесь мы имеем « {2,4} », следующий сразу за квадратными скобками. Это означает, что нам требуется от 2 до 4 символов из квадратных скобок для включения в адрес электронной почты. Так что com, net, org, uk, au и т. Д. Все действительны, но все, что дольше, чем это, не будет принято

    Наконец, знак $ в конце выражения обозначает конец строки. Если бы мы не включили это, тогда пользователь мог бы напечатать что-нибудь после конца адреса электронной почты, и это все еще подтвердило бы.

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

     <?php  if (!$_REQUEST['action']) {  ?>  <form action='<?=$_SERVER['PHP_SELF']; ?>' method='POST'>  Email Address: <input type='text' name='email'>  <input type='hidden' name='action' value='validate'>  <p>  <input type='submit' value='Submit'>  </form>  <?php  }   if ($_REQUEST['action'] == 'validate') {  if (eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+.([a-zA-Z]{2,4})$',        $_REQUEST['email'])) {  echo 'Valid';  } else {  echo 'Invalid';  }  }  ?> 

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

    Синтаксическая ссылка

    Это краткий справочник по основному синтаксису. Мы уже видели многое из этого ранее, но есть несколько новых вещей, которые вы можете найти полезными.

      ^ начало строки 
    $ конец строки
    [az] буквы az включительно в нижнем регистре
    [AZ] буквы AZ включительно в верхнем регистре
    [0-9] числа 0-9 включительно
    [^0-9] нет вхождений чисел 0-9 включительно
    ? ноль или один из предшествующих символов
    * ноль или более предшествующих символов
    + один или несколько предшествующих символов
    {2} 2 из предшествующих символов
    {2,} 2 или более предшествующих символа (ов)
    {2,4} 2 - 4 предыдущего символа (ов)
    . любой персонаж
    (a|b) a OR b
    пустое пространство (известно как пробел)