- •Лекция 4 Манипулирование строками и регулярные выражения
- •Форматирование строк
- •Усечение строк
- •Форматирование строк для представления Использование html- форматирования
- •Форматирование строк для печати
- •Форматирование строк для хранения
- •Объединение и разделение строк с помощью строковых функций
- •Сравнение строк
- •Упорядочение строк
- •Проверка длины строк
- •Сопоставление и замена подстрок с помощью строковых функций
- •Поиск строк в строках
- •Определение позиции подстроки
- •Замена подстрок
- •Регулярные выражения
- •Наборы символов и классы
- •Повторение
- •Подвыражения
- •Ветвление
- •Поиск подстрок с помощью регулярных выражений
- •Замена подстрок с помощью регулярных выражений
- •Разделение строк с помощью регулярных выражений
Подвыражения
Часто удобно разделять выражения на подвыражения, чтобы, например, можно было представить выражение “по меньшей мере одна из этих строк, за которой следует именно одна из следующих”. Это делается с помощью круглых скобок так же, как и в арифметических выражениях. Например, (very )* large соответствует строкам “large”, “very large”, “very very large” и т.д.
Количество повторений какой – либо строки можно указать с помощью числового выражения, заключенного в фигурные скобки ({}). При этом можно указывать точное число повторений {3}, диапазон повторений {2, 4} или открытый диапазон повторений {2,} (означает не менее двух повторений). Например, (very ) (1, 3) соответствует строкам “very”, “very very”, “very very very”.
Можно указать, должно ли конкретное подвыражение появляться в начале, конце или начале и конце строки. Например, следующая строка соответствует наличию подстроки bob в начале строки - ^bob; com$ - соответствует наличию данной подстроки в конце строки; ^[a-z]$ - соответствует любому одиночному символу в отдельной строке.
Ветвление
Вариант в регулярном выражении можно представить с помощью символы вертикальной черты (|).
Использование регулярных выражений в приложении Smart Form
В приложении регулярные выражения могут найти два потенциальных применения. Во-первых, – для выявления конкретных терминов в отзыве клиента. При использовании строковых функций для определения строк “shop”, “customer service” или “retail” приходилось выполнять три регулярных поиска. В случае применения регулярного выражения можно сопоставить сразу все три строки:
shop | customer service | retail
Второе применение – проверка адреса электронной почты клиента путем кодирования стандартизированного формата адреса электронной почты в регулярном выражении. Формат включает некоторые алфавитно – цифровые символы и символы пунктуации, за которыми следует символ @, затем строка алфавитно – цифровых символов или дефисов, затем точка, затем опять алфавитно – цифровые символы и дефисы и, возможно дополнительные точки, вплоть до конца строки; этот формат можно закодировать следующим образом:
^[a-zA-Z0-9_]+@[a-zA-z0-9\-]+\.[a-zA-Z0-9\-\.]+$
Если нужно сопоставить один из специальных символов таких как ., {, \ или $ перед ним необходимо поместить символ косой черты. Т.е. комбинация \. – соответствует значению “.”. Перед дефисом также поставлена косая черта, поскольку внутри квадратных символов он является специальным символом.
Поиск подстрок с помощью регулярных выражений
Поиск подстрок – основное применение регулярных выражений. В PHP существует две функции: ereg() и eregi(). Функция ereg() имеет следующий прототип:
int ereg(string pattern, string search, array [matches]);
Эта функция выполняет поиск в строке search, отыскивая в ней соответствие с регулярным выражением, определяемым в шаблоне pattern. Если соответствия будут найдены, они сохраняются в шаблоне, по одному в каждом элементе массива.
Функция eregi() идентична предыдущей, за исключением того, что она не чувствительна к регистру.
Приложение можно приспособить к использованию регулярных выражений следующим образом:
if (!ereg("^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$", $email))
{
echo "That is not a valid email address. Please return to the"
." previous page and try again.";
exit;
}
$toaddress = "feedback@bobsdomain.com"; // значение по умолчанию
if (ereg("shop|customer service|retail", $feedback))
$toaddress = "retail@bobsdomain.com";
else if (ereg("deliver.*|fulfil.*", $feedback))
$toaddress = "fulfilment@bobsdomain.com";
else if (ereg("bill|account", $feedback))
$toaddress = "accounts@bobsdomain.com";
if (eregi("bigcustomer\.com", $email))
$toaddress = "bob@bobsdomain.com";