logo search
Vvedenie_v_Veb_programmirovanien_2 / Vvedenie_v_Veb_programmirovanien_2

Perl-совместимые функции рнр для работы с регулярными выражениями

В РНР существует пять функций поиска по шаблону с использованием Perl-совместимых регулярных выражений: preg_match( ); preg_match_all( ); preg_replace( ); preg_split( ); preg_grep( ).

preg_match(pattern, $str, [regs]) – ищет в строке $str соответствия с регулярным выражением pattern , и сохраняет их в массиве regs (если указано). Пример:

<?php

$sub = "abcdef";

$pattern = '/^def/';

preg_match($pattern, $sub, $matches);

print_r($matches);

echo"<br/>";

$pattern = '/def$/';

preg_match($pattern, $sub, $matches);

print_r($matches);

?>

Вывод:

Array() Array ( [0] => def )

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

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

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

<?php

$str="Mersedes is а good car ever created!";

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

if (preg_match("/mers/i", $str, $match)!=0)

{

print_r($match);

}

$str = "регулярное выражение"; // просто строка

$preg = preg_replace("/р.+е/i", "<i>[вырезано]</i>", $str);

echo "<br/>".$preg;

echo"<br/>";

$string = 'April 15, 2010';

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

$replacement = '${1}1,$3';

echo preg_replace($pattern, $replacement, $string);

?>

Результат выполнения:

Array([0]=>Mers) [вырезано]April1,2010

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

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

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

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

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

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

<?php

preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x", "Call 555-1212 or 1-800-555-1212", $phones);

print_r ($phones);

echo "<br/>";

$html = "<b>bold text</b><a href=howdy.html>click me</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

foreach ($matches as $val) {

echo "matched: " . $val[0] . "\n";

echo "part 1: " . $val[1] . "\n";

echo "part 2: " . $val[2] . "\n";

echo "part 3: " . $val[3] . "\n";

echo "part 4: " . $val[4] . "\n\n";

}

echo "<br/>";

$userinfo = "Name: <b>Romanchik Valery</b> <br> Title: <b>PHP Тeacher</b>";

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

print_r ($pat_array);

print "<br/>".$pat_array[0][0]." <br> ".$pat_array[0][1]."\n";

?>

Результат:

Array ( [0] => Array ( [0] => 555-1212 [1] => 800-555-1212 ) [1] => Array ( [0] => [1] => 800 ) ) matched: bold text part 1: part 2: b part 3: bold text part 4:

matched: click me part 1: part 2: apart3:click me part4: Array ( [0] => Array ( [0] => Romanchik Valery [1] => PHP Тeacher ) [1] => Array ( [0] => RomanchikValery[1]=>PHPТeacher)) RomanchikValery PHP Тeacher

Функция array preg_split (string шаблон, string $str[, int порог [, int флаги]]) разбивает строку $str в массив посредством регулярного выражения. Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка. В следующем примере функция preg_split( ) используется для выборки информации из переменной.

<?php

$inf="+Romanchik+++VS+++++@gmail.com+++++bsu.by";

$fields = preg_split("/[\+]{1,}/", $inf);

print_r ($fields);

$i=0;

while ($i < sizeof($fields)){

print $fields[$i]. "<br/>";

echo $i++."<br/>";

}

?>

Результат:

Array([0]=>[1]=>Romanchik[2]=>VS[3]=>@gmail.com[4]=>bsu.by)

0

Romanchik

1

VS

2

@gmail.com

3

bsu.by

4

Функция array preg_grep (string $pattern, array $mas) перебирает все элементы заданного массива и возвращает в виде массива все элементы, в которых совпадает заданное регулярное выражение. Пример использования функции для поиска в массиве слов, начинающихся на р:

<?php

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

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

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

$pfoods = preg_grep("/p(\w+)/", $foods);

print_r( $pfoods);

echo "<br/>";

$i = 0;

while ($i < sizeof($foods)) {

print $pfoods[$i]. "<br>";

$i++;}

?>

Результат:

Array([0]=>pasta[3]=>potatoes)

pasta

Potatoes

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

<?

$data = ereg_replace ("[a-z]", "[A-Z]", $data);

print $data;

$data = strtoupper ($data);

?>

Медленная функция ereg_replace() потратит много времени на задачу, с которой функция strtoupper() справилась бы быстрее. Всегда следует искать более "лёгкую" замену регулярным выражениям, поскольку скорость выполнения вашего скрипта в таких случаях резко возрастает. Еще один способ замедлить выполнение Веб – приложения состоит в использовании функций форматированного ввода – вывода типа printf(), sscanf().