Интернет-Университет Информационных Технологий: бесплатное дистанционное образование компьютерным дисциплинам
  Лекции
Язык программирования PHP
1.   Введение в PHP
2.   Основы синтаксиса
3.   Управляющие конструкции
4.   Обработка запросов с помощью PHP
5.   Функции в PHP
6.   Объекты и классы в PHP
7.   Работа с массивами данных
8.   Работа со строками
9.   Работа с файловой системой
10.   Базы данных и СУБД. Введение в S...
11.   Взаимодействие PHP и MySQL
12.   Авторизация доступа с помощью се...
13.   Регулярные выражения
14.   Взаимодействие PHP и XML
15.   Использование шаблонов в PHP
    Экзамен
    Сдать экзамен экстерном
    Литература
    Предметный указатель
    Примеры

Язык программирования PHP
13. Лекция: Регулярные выражения
Страницы: « | 1 | 2 | 3 | 4 | 5 | вопросы | » | учебники | для печати и PDA
  Если Вы заметили ошибку - сообщите нам.  

Примеры (^ и $)

  1. Пусть дан такой текст, записанный в виде строки:
    $str = "11 aaa bbb ".
               "ccc 22 ddd ".
                  "eee ggg 33";
    
    Таблица 13.1. Метасимволы, распознаваемые ВНУТРИ квадратных скобок
    МетасимволЗначение
    \Переходный символ со множеством назначений
    ^Отрицание класса, но только если это первый символ (например, «^\d» задает все, кроме цифр)
    -Задает диапазон символов (например, «0-9» задает все цифры, «A-Z» – все латинские буквы)
    ]Вычисляет символьный класс

    Регулярное выражение /\d\d/m может быть сопоставлено следующим подстрокам: 11, 22, 33. Если в начале РВ стоит ^, то совпадения ищутся в начале строки, поэтому выражение /^\d\d/m найдет только 11.

    Когда в конце РВ стоит знак доллара $, поиск производится в конце строки, поэтому выражение /\d\d$/m найдет только 33.

    Шаблону же /^\d\d\d$/ будет удовлетворять строка, целиком состоящая из трехзначного числа (т.е. она и начинается и заканчивается этим числом).

  2. Найдем все html-теги, расположенные в начале каждой строки файла 1.htm.
    <?
    //считываем файл в строку
    $str = file_get_contents('1.htm');
    $pattern = "!^<[^/]+>!mU";
    // осуществляем поиск
    $n = preg_match_all ($pattern, 
                         $str, $res);
    // выводим результаты 
    for ($i=0;$i<$n;$i++)  
       echo htmlspecialchars($res[0][$i]).
                             "<br>";
    ?>
    
    Таблица 13.2. Метасимволы, распознаваемые ВНЕ квадратных скобок
    МетасимволЗначение
    \Переходный символ со множеством назначений
    ^Объявляет начало объекта (или строки в многострочном режиме). То есть этот символ определяет, что искомый текст должен находиться в начале строки. Альтернатива: «\A»
    $Объявляет конец объекта (или строки в многострочном режиме). То есть этот символ определяет, что искомый текст должен находиться в конце строки. Альтернативы: «\Z», «\z»
    .Совпадает с любым символом, кроме символа перевода строки (по умолчанию)
    [Начинает определение символьного класса
    ]Заканчивает определение символьного класса
    |Разделяет перечисление альтернативных вариантов
    (Начинает подшаблон регулярное (подвыражение)
    )Заканчивает подшаблон
    ?Расширяет значение «(», квантификаторов 0 или 1, и квантификатор минимизации
    *0 или больше повторений (квантификатор)
    +1 или больше повторений (квантификатор)
    {Начинает минимальный/максимальный квантификатор
    }Заканчивает минимальный/максимальный квантификатор

    Шаблон ограничен восклицательными знаками. Первая «^» значит, что мы ищем совпадения в начале строк, потом идет символ «<» – его и ищем в строке, после него должно идти все, что угодно, кроме обратного слэша (конструкция «[^\]» ), «+» говорит, что стоящий перед ним символ повторяется один и более раз и заканчивается все это символом «>». Таким образом, выделяются все теги в начале строк.

  3. Мы хотим убедиться, что имя автора было записано правильно (сначала фамилия с большой буквы, потом инициалы через точку) и находится в конце строки.
    <?
    //считываем файл в строку
    $str = file_get_contents('1.htm');
    $pattern = "!\s[А-Яа-я]+".
     "\s([А-Я]\.\s*)([А-Я]\.\s*)$!m";
    // шаблон ограничен восклицатель-
    // ными знаками, m – модификатор,
    // включающий многострочный режим
    // первый \s означает, что перед 
    // фамилией должен идти пустой 
    // символ (например, пробел)  
    // [А-Яа-я] задает одну из букв  
    // алфавита в любом регистре,а в  
    // комбинации со знаком плюс 
    // определяет,что эта буква 
    // повторяется один и более 
    // раз следующий \s означает, что 
    // между фамилией  и инициалами 
    // должен быть пробел
    // Далее идет подвыражение,  
    // определяющее инициалы.
    // Это буква от А до Я, после
    // которой стоит точка ('\.')
    // Экранируем точку, чтобы   
    // избавиться от ее специального   
    // значения. После буквы с точкой 
    // может идти или не идти пробел 
    // или несколько. Вся конструкция 
    // повторяется минимум два раза.
    // Последний символ $ означает,
    // что фамилия с инициалами
    // должны находиться в конце 
    // строки. 
    //осуществляем поиск
    $n = preg_match_all ($pattern,
                         $str, $res);
    // выводим результаты
    for ($i=0;$i<$n;$i++) 
       echo htmlspecialchars($res[0][$i]).
                             "<br>"; 
    ?>
    

Примеры ( | и .)

  1. Пусть имеется некий текст. Нам нужно найти всех упомянутых в нем людей со званиями.
<?
$str = "Доцент Смирнов совершил". 
   "открытие. Его учителем была ".
     "профессор Иванова. ".
       "Этим открытием Смирнов ".
        "завоевал себе степень ".
          "доктора. Раньше он был ".
           "только кандидат.";
$pattern = "/(профессор|доцент)".
            "\s[А-Яа-я]+(\s|\.)/i";
// осуществляем поиск
$n = preg_match_all ($pattern, $str,
                                $res);
// выводим результаты
for ($i=0;$i<$n;$i++) 
   echo htmlspecialchars($res[0][$i]).
                         "<br>";
?>

Метасимвол прямая черта « | » позволяет задавать альтернативные варианты. В примере мы хотели найти всех профессоров или доцентов. Для этого было создано подвыражение «(профессор|доцент)». После звания через пробел фамилия человека, которому оно принадлежит, – для этого существует комбинация «\s[А-Яа-я]+». После фамилии идет либо опять пробел, либо точка, если это конец предложения. Получаем опять два альтернативных варианта: «(\s|\.)» (здесь точка экранируется обратным слэшем, чтобы она понималась как обычная точка, без специального значения).

Дальше »
  Если Вы заметили ошибку - сообщите нам.  
Страницы: « | 1 | 2 | 3 | 4 | 5 | вопросы | » | учебники | для печати и PDA
Курсы | Учебные программы | Учебники | Новости | Форум | Помощь

Телефон: (495) 253-9312, 253-9313, факс: (495) 253-9310, email: info@intuit.ru
© 2003-2006, INTUIT.ru::Интернет-Университет Информационных Технологий - дистанционное образование