Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
модуль пхп.doc
Скачиваний:
10
Добавлен:
29.08.2019
Размер:
713.22 Кб
Скачать

Поиск и замена подстрок

Следующие три функции уже упоминались в разделе "Базовые операции со строками": int  strpos ( string $s , string $sample , [ int $startPos=0 ] );

Возвращает позицию первого вхождения строки $sample в строку $s начиная с позиции $startPos. Если $startPos не задана, то ищет вхождение с начала строки $s. Если строка $sample не найдена, возвращает false.

string  substr ( string $s , int $startPos [ , int $length ] );

Возвращает подстроку строки $s начиная с позиции $startPos. Эта позиция отсчитывается относительно начала строки, если $startPos неотрицательна, и от конца строки в противном случае.  Необязательный параметр $length определяет количество символов в подстроке. Если он положителен, указанное количество отсчитывается относительно $startPos, если отрицателен - от конца строки $s. Если он не задан, то возвращается подстрока от позиции $startPos и до конца строки $s.

string  str_replace ( string $srcSample , string $dstSample , string $s );

Возвращает строку, в которой все вхождения $srcSample строки $s заменены на $dstSample.

Дополнительные функции:

Int  strrpos ( string $s , string $sample );

Возвращает позицию последнего вхождения первого символа строки $sample в строку $s. Все символы строки $sample , кроме первого, игнорируются.

string strstr ( string $s , string $sample );

Возвращает подстроку строки $s, начиная с позиции первого вхождения $sample и до конца строки.

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

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

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

Алгоритм поиска с использованием регулярных выражений был впервые разработан одним из создателей UNIX Кеном Томпсоном. Интересно, что изначально регулярные выражения появились не в теории вычислительных систем, а в нейрофизиологии. Основу теории регулярных выражений заложили нейрофизиологи У. Мак-Каллох и У. Питтс, работавшие над способами математического описания нервных процессов. Позднее математик С. Клини, основываясь на этих исследованиях, опубликовал работу "Представление событий в нейронных сетях", в которой и было введено понятие регулярных выражений. Кен Томпсон, основываясь на этих работах, адаптировал теорию регулярных выражений для алгоритмов поиска информации. Именно начиная с его работ, регулярные выражения стали использоваться в текстовых редакторах и вошли во многие языки программирования.

Базовый синтакси и создание регулярных выражений

Простейшее регулярное выражение можно записать так:

"abc"

Это выражение соответствует любой строке, которая содержит подстроку "abc".

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

"[abc]"

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

Допустим, нам нужно создать регулярное выражение, соответствующее всем буквам русского алфавита. В этом случае мы можем, конечно, перечислить все эти буквы в регулярном выражении. Это допустимо, но утомительно и неэлегантно. Более коротко такое регулярное выражение можно записать следующим образом:

"[а-Я]"

Это выражение соответствует всем буквам русского алфавита, поскольку любые два символа, разделяемые дефисом, задают соответствие диапазону символов, находящихся между ними. Заметьте, что регулярное выражение "[а-Я]" описывает символы как нижнего, так и верхнего регистров, поэтому более подробно это выражение можно записать так:

"[а-яА-Я]"

Точно таким же образом задаются регулярные выражения, соответствующие числам:

"[0-9]"

или

"[0123456789]"

Метасимволы

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

Существуют два различных набора метасимволов: те, которые используются внутри квадратных скобок, и те, которые используются вне квадратных скобок. Вне квадратных скобок используются следующие метасимволы:

\общий экранирующий символ, допускающий несколько вариантов применения

^декларирует начало данных (или строки, в многострочном режиме)

$декларирует конец данных (или строки, в многострочном режиме)

.соответствует любому символу, кроме перевода строки (по умолчанию)

[начало описания символьного класса

]конец описания символьного класса

|начало ветки условного выбора

(начало подмаски

)конец подмаски

?расширяет смысл метасимвола (, является также квантификатором, означающим отсутствие либо ровно 1 вхождение, также преобразует жадные квантификаторы в ленивые (смотрите повторение)

*квантификатор, означающий 0 или более вхождений

+квантификатор, означающий 1 или более вхождений

{начало количественного квантификатора

}конец количественного квантификатора

Часть шаблона, заключенная в квадратные скобки, называется "символьным классом". Внутри символьных классов используются следующие метасимволы:

\общий экранирующий символ

^означает отрицание класса, допустим только в начале класса

-означает символьный интервал

]завершает символьный класс