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

Установка локальных настроек

Локалью называют совокупность таких настроек, как формат даты и времени, язык, кодировка. Для установки локали используется функция SetLocale($category, $locale). Параметр $category может принимать следующие строковые значения: LC_CTYPE – активизирует указанную локаль для функций перевода в верхний/нижний регистры; LC_NUMERIC – активизирует локаль для функций форматирования дробных чисел, задает разделитель целой и дробной части в числах; LC_TIME – задает формат вывода даты и времени; LC_ALL – устанавливает все вышеперечисленные режимы. Параметр $locale задает локаль, по установленному в системе уникальному имени. Если величина $locale равна пустой строке "", то устанавливается та локаль, которая указана в глобальной переменной окружения, если в этом параметре передается 0, то новая локаль не устанавливается, а возвращается имя текущей локали для указанного режима.

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

Базовым средством для поиска данных по шаблону являются регулярные выражения – последовательность символов, применяемых для поиска искомого текста. Напомним основные сведения о структурах, применяемых для поиска.

Простейшее регулярное выражение совпадает с одним или несколькими символами строки в наклонных скобках, например, /Jav/. Квадратные скобки [ ] означают “любой символ из перечисленных в скобках”, например [123abc], и могут содержать интервалы. Конструкция [a-zA-Z] совпадает с любым символом, входящим в интервалы (a-z и A-Z), конструкция [^a-zA-Z] совпадает с любым символом, не входящим в указанные интервалы. Символ точка означает <любой символ>. Например, выражение р.р совпадает с символом р, за которым следует произвольный символ, после чего опять следует символ р. Служебные символы экранируются обратной косой чертой (\). Если, например, в тексте надо поставить точку, то следует писать \.

Специальные символы представляет собой алфавитный символ с префиксом \ – признаком особой интерпретации следующего символа:

\d – десятичная цифр, \D – любой символ кроме десятичной цифры;

\w – алфавитно-цифровой символ,\W – не алфавитно-цифровой;

\s – пробельный символ, \S – не пробельный символ;

Часто используются символы \n ,\r , \t ,\\. Символ \b совпадает с границами слов: /sa\b/, символ \В не совпадает с границей слова: /sa\B/.

Символы +, * и {...}, обозначающие количество повторений отдельного символа или конструкции, заключенной в квадратные скобки, называются квантификаторами. Рассмотрим несколько примеров.

Если записать регулярное выражение /stud/ как /stud/i, поиск осуществляется без учета регистра. Выражение /^stud/i означает, что stud должно находиться в начале слова (student), а /stud$/ – в конце (restud). Регулярное выражение /^$/i соответствует пустой строке. Шаблон /stu+/ совпадает с последовательностью stu, за которой могут следовать дополнительные символы u. Аналогично шаблон /st{2,4}/ совпадает с символом s, за которым следуют от 2 до 4 экземпляров символа t. Выражение /[\d]+/ используется для поиска цифровой подстроки. Шаблон /<([\w]+)>/ совпадает с конструкциями, заключенными в угловые скобки, например тегами HTML.

Подстроки в регулярных выражениях можно группировать при помощи круглых скобок: /домен – (by|ru|uk|com)/ соответствует строке домен – by или другой. Круглые скобки ( ) означают логическую группу выражений, которая может повторяться (+).

В шаблонах может использоваться оператор | (или), который проверяет совпадение одной из нескольких альтернатив.

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

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

Пример:

<?php //ppr36.php

$sub = "abcdef";

$pattern = '/^def/'; //ищем def в начале строки

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

print_r($matches);

echo"<br/>";

$pattern = '/def$/';// ищем def в конце строки

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

print_r($matches);

?>

Вывод:

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

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

mixed preg_replace (mixed шаблон, mixed замена, mixed строка)

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

<?php //ppr36.php

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

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

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

{

print_r($match);

}

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

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

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 совпадения)

Следующий пример показывает, как при помощи функции 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 $strike) разбивает строку $strike в массив посредством регулярного выражения. В следующем примере функция 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. Но в то же время регулярные выражения работают медленно. Например, для перевода целой строки в заглавные буквы можно написать следующее:

<?

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

print $data;

$data = strtoupper ($data);

?>

Функция strtoupper() с этой задачей справилась бы быстрее. Всегда следует искать более "легкую" замену регулярным выражениям, поскольку скорость выполнения скрипта в таких случаях резко возрастает.