PHP 4 на практике

       

Функции РНР для работы с регулярными выражениями (POSIX-совместимые)


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

  • еrеg( );
  • еrеg_rерlасе( );
  • eregi( );
  • eregi_replace( );
  • split( );
  • spliti( );
  • sql_regcase( ).
  • Описания этих функций приведены в следующих разделах.

    ereg( )

    Функция еrеg( ) ищет в заданной строке совпадение для шаблона. Если совпадение найдено, возвращается TRUE, в противном случае возвращается FALSE. Синтаксис функции ereg( ):

    int ereg (string шаблон, string строка [, array совпадения])



    Поиск производится с учетом регистра алфавитных символов. Пример использования ereg( ) для поиска в строках доменов .соm:

    $is_com - ereg("(\.)(com$)", $email):

    // Функция возвращает TRUE, если $email завершается символами ".com"

    // В частности, поиск будет успешным для строк

    // "www.wjgilmore.com" и "someemail@apress.com"

    Обратите внимание: из-за присутствия служебного символа $ регулярное выражение совпадает только в том случае, если строка завершается символами .com. Например, оно совпадет в строке "www.apress.com", но не совпадет в строке "www.apress.com/catalog".

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

    Листинг 8.1.

    Вывод элементов массива $regs

    $url = "http://www.apress.com";

    // Разделить $url на три компонента: "http://www". "apress" и "com"

    $www_url = ereg("^(http://www)\.([[:alnum:]+\.([[:alnum:]]+)". $url, $regs);

    if ($www_url) : // Если переменная $www_url содержит URL

    echo $regs[0]; // Вся строка "http://www.apress.com"

    print "<br>";

    echo $regs[l]; // "http://www"

    print "<br>";

    echo $regs[2]; // "apress"

    print "<br>";

    echo $regs[3]; // "com" endif;

    При выполнении сценария в листинге 8.1 будет получен следующий результат:


    В РНР существует пять функций поиска по шаблону с использованием Perl-совместимых регулярных выражений:

    • preg_match( );
    • preg_match_all( );
    • preg_replace( );
    • preg_split( );
    • preg_grep( ).
    • Эти функции подробно описаны в следующих разделах.

      preg_match( )

      Функция pregjnatch( ) ищет в заданной строке совпадение для шаблона. Если совпадение найдено, возвращается TRUE, в противном случае возвращается FALSE. Синтаксис функции pregjnatch( ):

      int pregjnatch (string шаблон, string строка [, array совпадения})

      При передаче необязательного параметра совпадения массив заполняется совпадениями различных подвыражений, входящих в основное регулярное выражение. В следующем примере функция preg_match( ) используется для проведения поиска без учета регистра:

      $linе = "Vi is the greatest word processor ever created!";

      // Выполнить поиск слова "Vi" без учета регистра символов:

      if (preg_match("/\bVi\b\i", $line, $matcn)) :

      print "Match found!";

      endif;

      // Команда if в этом примере возвращает TRUE

      preg_match_all( )

      Функция preg_match_all( ) находит все совпадения шаблона в заданной строке.

      Синтаксис функции preg_match_all( ):

      Int preg_match_all (string шаблон, string строка, array совпадения [, int порядок])

      Порядок сохранения в массиве совпадения текста, совпавшего с подвыражениями, определяется необязательным параметром порядок. Этот параметр может принимать два значения:

      • PREG_PATTERN_ORDER — используется по умолчанию, если параметр порядок не указан. Порядок, определяемый значением PREG_PATTERN_ORDER, на первый взгляд выглядит не совсем логично: первый элемент (с индексом 0) содержит массив совпадений для всего регулярного выражения, второй элемент (с индексом 1) содержит массив всех совпадений для первого подвыражения в круглых скобках и т. д.;
      • PREG_SET_ORDER — порядок сортировки массива несколько отличается от принятого по умолчанию. Первый элемент (с индексом 0) содержит массив с текстом, совпавшим со всеми подвыражениями в круглых скобках для первого найденного совпадения. Второй элемент (с индексом 1) содержит аналогичный массив для второго найденного совпадения и т. д.



      • http://www.apress.com http://www apress com

        ereg_replace( )

        Функция ereg_replace( ) ищет в заданной строке совпадение для шаблона и заменяет его новым фрагментом. Синтаксис функции ereg_replace( ):

        string ereg_replace (string шаблон, string замена, string строке)

        Функция ereg_replace( ) работает по тому же принципу, что и ereg( ), но ее возможности расширены от простого поиска до поиска с заменой. После выполнения замены функция возвращает модифицированную строку. Если совпадения

        отсутствуют, строка остается в прежнем состоянии. Функция ereg_replace( ), как и еrеg( ), учитывает регистр символов. Ниже приведен простой пример, демонстрирующий применение этой функции:

        $copy_date = "Copyright 1999":

        $copy_date = ereg_replace("([0-9]+)". "2000", $copy_date);

        print $copy_date: // Выводится строка "Copyright 2000"

        У средств поиска с заменой в языке РНР имеется одна интересная возможность — возможность использования обратных ссылок на части основного выражения, заключенные в круглые скобки. Обратные ссылки похожи на элементы необязательного параметра-массива совпадения функции еrеg( ) за одним исключением: обратные ссылки записываются в виде \0, \1, \2 и т. д., где \0 соответствует всей строке, \1 — успешному совпадению первого подвыражения и т. д. Выражение может содержать до 9 обратных ссылок. В следующем примере все ссылки на URL в тексте заменяются работающими гиперссылками:

        $url = "Apress (http://www.apress.com");

        $url = ereg_replace("http://(([A-Za-z0-9.\-])*)", "<a href=\"\\0\">\\0</a>", $url);

        print $url;

        // Выводится строка:

        // Apress (<a href="http://www.apress.com">http://www.apress.com</a>)

        eregi( )

        Функция eregi( ) ищет в заданной строке совпадение для шаблона. Синтаксис функции eregi( ):

        int eregi (string шаблон, string строка [, array совпадения])

        Поиск производится без учета регистра алфавитных символов. Функция eregi( ) особенно удобна при проверке правильности введенных строк (например, паролей). Использование функции eregi( ) продемонстрировано в следующем примере:



        $password = "abc";

        if (! eregi("[[:alnum:]]{8.10}, $password) :

        print " Invalid password! Passwords must be from 8 through 10 characters in length.";

        endif;

        // В результате выполнения этого фрагмента выводится сообщение об ошибке.

        // поскольку длина строки "abc" не входит в разрешенный интервал

        // от 8 до 10 символов.

        eregi_replace( )

        Функция eregi_replасе( ) работает точно так же, как ereg_replace( ), за одним исключением: поиск производится без учета регистра символов. Синтаксис функции ereg_replace( ):

        string eregi_replace (string шаблон, string замена, string строка)

        split( )

        Функция split( ) разбивает строку на элементы, границы которых определяются по заданному шаблону. Синтаксис функции split( ):

        array split (string шаблон, string строка [, int порог])

        Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка слева направо. Если шаблон содержит алфавитные символы, функция spl it( ) работает с учетом регистра символов. Следующий пример демонстрирует использование функции split( ) для разбиения канонического IP-адреса на триплеты:

        $ip = "123.345.789.000"; // Канонический IP-адрес

        $iparr = split ("\.", $ip) // Поскольку точка является служебным символом.

        // ее необходимо экранировать.

        print "$iparr[0] <br>"; // Выводит "123"

        print "$iparr[1] <br>"; // Выводит "456"

        print "$iparr[2] <br>"; // Выводит "789"

        print "$iparr[3] <br>"; // Выводит "000"

        spliti( )

        Функция spliti( ) работает точно так же, как ее прототип split( ), за одним исключением: она не учитывает регистра символов. Синтаксис функции spliti( ):

        array spliti (string шаблон, string строка [, int порог])

        Разумеется, регистр символов важен лишь в том случае, если шаблон содержит алфавитные символы. Для других символов выполнение spliti( ) полностью аналогично split( ).

        sql_regcase( )

        Вспомогательная функция sql_regcase( ) заключает каждый символ входной строки в квадратные скобки и добавляет к нему парный символ. Синтаксис функции sql_regcase( ):

        string sql_regcase (string строка)

        Если алфавитный символ существует в двух вариантах (верхний и нижний регистры), выражение в квадратных скобках будет содержать оба варианта; в противном случае исходный символ повторяется дважды. Функция sql_regcase( ) особенно удобна при использовании РНР с программными пакетами, поддерживающими регулярные выражения в одном регистре. Пример преобразования строки функцией sql_regcase( ):

        $version = "php 4.0";

        print sql_regcase($version);

        // Выводится строка [Pp][Hh][Pp][ ][44][..][00]



        Следующий пример показывает, как при помощи функции preg_match_al( ) найти весь текст, заключенный между тегами HTML <b>...</b>:

        $user_info = "Name: <b>Rasmus Lerdorf</b> <br> Title: <b>PHP Guru</b>";

        preg_match_all ("/<b>(.*)<\/b>/U", Suserinfo. $pat_array);

        print $pat_array[0][0]." <br> ".pat_array[0][l]."\n":

        Результат:

        Rasmus Lerdorf

        PHP Guru

        preg_replace( )

        Функция preg_repl ace( ) работает точно так же, как и ereg_replасе( ), за одним исключением — регулярные выражения могут использоваться в обоих параметрах, шаблон и замена. Синтаксис функции preg_replace( ):

        mixed preg_replace (mixed шаблон, mixed замена, mixed строка [, int порог])

        Необязательный параметр порог определяет максимальное количество замен в строке. Интересный факт: параметры шаблон и замена могут представлять собой масивы. Функция preg_replace( ) перебирает элементы обоих массивов и выполняет замену по мере их нахождения.

        preg_split( )

        Функция preg_spl it( ) аналогична split( ) за одним исключением — параметр шаблон может содержать регулярное выражение. Синтаксис функции preg_split( ):

        array preg_split (string шаблон, string строка [, int порог [, int флаги]])

        Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка. В следующем примере функция preg_split( ) используется для выборки информации из переменной.

        $user_info="+wj+++Gilmore+++++wjgi]more@hotmail.com

        +++++++Columbus+++OH";

        $fields = preg_split("/\+{1.}/", $user_info);

        while ($x < sizeof($fields)):

        print $fields[$x]. "<br>";

        $x++;

        endwhile;

        Результат:

        WJ

        Gilmore

        wjgilmore@hotmail.com

        Columbus

        OH

        preg_grep( )

        Функция preg_grep( ) перебирает все элементы заданного массива и возвращает все элементы, в которых совпадает заданное регулярное выражение. Синтаксис функции preg_grep():

        array preg_grep (string шаблон, array массив)

        Пример использования функции preg_grep( ) для поиска в массиве слов, начинающихся на р:

        $foods = array ("pasta", "steak", "fish", "potatoes");

        // Поиск элементов, начинающихся с символа "р".

        // за которым следует один или несколько символов

        $p_foods = preg_grep("/p(\w+)/", $foods):

        $х = 0;

        while ($x < sizeof($p_foods)) :

        print $p_foods[$x]. "<br>";

        $Х++;

        endwhile;

        Результат:

        pasta

        potatoes


        Содержание раздела