Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
php учебник_весь.doc
Скачиваний:
8
Добавлен:
21.09.2019
Размер:
2.06 Mб
Скачать

Perl-совместимые регулярные выражения

PHP поддерживает ряд функций для работы с Perl-совместимыми регулярными выражениями (PCRE - Perl Compatible Regular Expression). Такие выражения заключаются в ограничители, в качестве которых, как правило, используется прямой слеш:

/mail/

Это выражение соответствует строке, содержащей слово "mail".

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

  • i (Игнорировать регистр при поиске соответствия. Т. е. выражение "/mail/i" будет соответствовать как строке "MAIL", так и строке "mail".);

  • x (Игнорировать пробельные символы).

Для PCRE-выражений характерно применение общих типов символов, которые аналогичны классам символов для регулярных выражений в стиле POSIX. Наиболее часто встречающиеся общие типы символов приведены ниже.

  • \d - соответствие десятичной цифре

  • \D - соответствие любому символу, за исключением десятичных цифр

  • \s - соответствие пробельным символам

  • \S - соответствие любым символам, кроме пробельных

  • \h - наличие границы слова

  • \B - отсутствие границы слова

  • \Z - конец строки или символ перевода конца строки

  • \A - начало строки

Теперь рассмотрим основные функции, которые есть в PHP для работы с PCRE-выражениями.

preg_match()

int preg_match (string pattern, string subject [, array matches])

Эта функция ищет в строке subject соответствие регулярному выражению pattern. Если задан необязательный параметрmatches, то результаты поиска помещаются в массив.

Приведем несколько примеров.

<?

$str = "PHP один из лучших языков программирования для Web";

if (preg_match ("/php/i", $str))

{

echo("Соответствие найдено");

}

else

{

echo("Соответствие не найдено");

}

?>

Результат:

Соответствие найдено

<?

$str = "PHP один из лучших языков программирования для Web";

if (preg_match ("/\bweb\b/i", $str))

{

echo("Соответствие найдено");

}

else

{

echo("Соответствие не найдено");

}

?>

Результат:

Соответствие найдено

<?

// получаем www-адрес (имя хоста) из url

$url = "http://www.php.net/download.html";

preg_match("/^(http:\/\/)?([^\/]+)/i", $url, $matches);

$host = $matches[2];

echo("www-адрес: $host");

echo("<br>");

// получаем последние два сегмента имени хоста (доменное имя)

preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);

echo "доменное имя: {$matches[0]}\n";

?>

Результат:

www-адрес: www.php.net

доменное имя: php.net

preg_replace()

mixed preg_replace (mixed pattern, mixed replacement, mixed subject

[,int limit])

Эта функция ищет в строке subject соответствия регулярному выражению pattern, и заменяет их на replacement. Необязательного параметр limit задает число соответствий, которые надо заменить. Если этот параметр не указан, или равен -1, то заменяются все найденные соответствия.

<?

$str = "May 15, 2003";

$pattern = "/(\w+) (\d+), (\d+)/i";

$replacement = "1 \${1} \$3";

print preg_replace($pattern, $replacement, $str);

?>

Результат:

1 May 2003

А вот как можно написать функцию, которая будет практически полным аналогом функции htmlspecialchars.

<?

function my_htmlspecialchats($document)

{

$search = array ("']*?>.*?'si",

"'<[\/\!]*?[^<>]*?>'si",

"'([\r\n])[\s]+'",

"'&(quot|#34);'i",

"'&(amp|#38);'i",

"'&(lt|#60);'i",

"'&(gt|#62);'i",

"'&(nbsp|#160);'i",

"'&(iexcl|#161);'i",

"'&(cent|#162);'i",

"'&(pound|#163);'i",

"'&(copy|#169);'i",

"'&#(\d+);'e");

$replace = array ("",

"",

"\\1",

"\"",

"&",

"<",

">",

" ",

chr(161),

chr(162),

chr(163),

chr(169),

"chr(\\1)");

$text = preg_replace ($search, $replace, $document);

return $text;

}

$doc = "alert;"; // напишем java-скрипт

my_htmlspecialchats($doc); // выводит "alert;"

echo($doc);

?>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]