Similar presentations:
Основы PHP. Сериализация
1.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Поговорим о:
Сериализация
Простая обработка строк
Хеширование
Регулярные выражения и функции для работы с ними
1
2.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Сериализация массива
Сериализация – это процесс перевода какой-либо структуры данных в последовательность битов. В случае с сериализацией php, происходит
преобразование сложной структуры хранения данных в простую текстовую строку.
Десериализация – это обратная операция, когда из одной строки, на выходе получаем сложную структуру.
string serialize (mixed value)
serialize() возвращает строку с байтово-поточным
представлением значения value, которое может
храниться где угодно.
mixed unserialize (string str)
$ar = array(
"merkuriy"=>array("size" => 5800, "diameter" => 4880, "massa" => 3.3e23),
"venera" => array("size" => 10820,"diameter" => 12100,"massa" => 4.9e24),
"earth" =>array("size" => 14960,"diameter" => 6371,"massa" => 6e24),
);
$qwerty = serialize($ar);
unserialize() принимает одну сериализованную
переменную и конвертирует её обратно в РНР-значение.
Возвращается конвертированное значение, которое
может быть integer, float, string, array или object.
a:3:{s:8:"merkuriy";a:3:{s:4:"size";i:5800;s:8:"diameter";i:4880;s:5:"massa";d:3.300
0000000000003E+23;}s:6:"venera";a:3:{s:4:"size";i:10820;s:8:"diameter";i:12100;s:
5:"massa";d:4.9000000000000003E+24;}s:5:"earth";a:3:{s:4:"size";i:14960;s:8:"dia
meter";i:6371;s:5:"massa";d:5.9999999999999999E+24;}}
2
3.
ОСНОВЫ PHPУрок
№11
Урок
№4
Основы PHP
Обработка строк
Эти функции предназначены для выполнения различных манипуляций со строками. Более специализированные функции будут на слайдах,
посвященных регулярным выражениям и обработке URL.
addslashes() – экранирует спецсимволы в строке
(кавычки). Часто применяется при записи в базу данных.
stripslashes() – возвращает спецсимволам человеческий
вид.
string addcslashes ( string $str , string $charlist )
Возвращает строку, экранированную обратными
слешами перед символами, указанными в параметре
charlist.
$ar = "D'artanian";
$qwerty = addcslashes($ar, "r,t");
//выведет: D'a\r\tanian
stripсslashes() – снимает экранирование.
int strpos ( string haystack, string needle [, int offset] ) - возвращает
позицию первого вхождения подстроки
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a',);
$pos = strpos($newstring, 'a', 1);
// $pos = 0
// $pos = 7, не 0
int strrpos ( string haystack, string needle [, int offset] ) – возвращает
позицию последнего вхождения подстроки
string substr ( string string, int start [, int length] ) - возвращает подстроку
$rest = substr("abcdef", 1);
$rest = substr("abcdef", 1, 3);
$rest = substr("abcdef", -2);
$rest = substr("abcdef", -3, 1);
// возвращает "bcdef"
// возвращает "bcd«
// возвращает "ef"
// возвращает "d«
3
4.
ОСНОВЫ PHPУрок
№11
Урок
№4
Основы PHP
Обработка строк - str_replace, substr_replace
mixed str_replace ( mixed search, mixed replace, mixed subject [, int
&count] ) - эта функция возвращает строку или массив subject, в
котором все вхождения search заменены на replace.
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");
// результат: <body text='black'>
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");
// результат: Hll Wrld f PHP
$phrase = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);
// результат: You should eat pizza, beer, and ice cream every day
// начиная с версии 5.0.0 доступен аргумент count
$str = str_replace("ll", "", "good golly miss molly!", $count);
echo $count;
// 2
str_ireplace -- Регистронезависимый вариант функции str_replace
string substr_replace ( string string, string replacement, int start [, int length] ) заменяет часть строки string начинающуюся с символа с порядковым
номером start и длиной lengthстрокой replacement и возвращает результат.
Если start - полож. число, замена начинается с символа с порядковым номером start.
Если start - отриц. число, замена начинается с символа с порядковым номером start,
считая от конца строки.
Если аргумент length - полож. число, то он определяет длину заменяемой подстроки.
Если отриц. - то определяет кол-во символов от конца строки, на котором заканчивается
замена. length необязателен и по умолчанию это замена до конца строки string.
$var = 'ABCDEFGH:/MNRPQR/';
echo substr_replace($var, 'bob', 0); // заменяет всю строку $var на 'bob'.
echo substr_replace($var, 'bob', 0, 0);
// Вставляет 'bob' в начало $var.
/* заменяет 'MNRPQR' in $var на 'bob'. */
echo substr_replace($var, 'bob', 10, -1);
echo substr_replace($var, 'bob', -7, -1) ;
echo substr_replace($var, '', 10, -1);
// Удаляет 'MNRPQR' из $var.
4
5.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Обработка строк
string strtr ( string str, string from, string to )
string strtr ( string str, array replace_pairs )
string str_repeat ( string input, int multiplier ) - возвращает строку input_str,
повторенную multiplier раз. multiplier должен быть больше или равен нулю.
Если он равен нулю, возвращается пустая строка.
Эта функция возвращает строку str, в которой каждое вхождение
любого символа из перечисленных в from заменено на
соответствующий символ из строки to.
Если длины строк from и to отличаются, "лишние" символы в более
длинной строке не используются.
int substr_count ( string haystack, string needle ) - возвращает число
вхождений подстроки needle в строку haystack. Поиск ведется с учетом
регистра символов.
Пример 1:
$addr = strtr($addr, "дец", "aao");
int strcmp ( string str1, string str2 ) - сравнение строк, безопасное для данных
в двоичной форме. Эта функция учитывает регистр символов.
Возвращает отрицательное число, если str1 меньше, чем str2;
положительное число, если str1 больше, чем str2, и 0 если строки равны.
Пример 2:
$trans = array("hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
strtolower() - преобразует строку в нижний регистр.
strtoupper() – перевод в верхний регистр.
// hello all, I said hi
5
6.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Строку -> в Массив и обратно
array explode ( string separator, string string [, int limit] ) - возвращает массив строк, полученных разбиением строки string с
использованием separator в качестве разделителя. Если передан аргумент limit передан, массив будет содержать максимум limit
элементов, при этом последний элемент будет содержать остаток строки string. Если separator не содержится в string, то explode()
возвращает массив, содержащий один элемент string.
$names = “Nick Serg Ivan Demid";
$name_mass = explode(" ", $names);
echo $ name_mass[0];
// Nick
string implode ( string glue, array pieces ) - Возвращает строку,
полученную объединением строковых представлений элементов
массива pieces, со вставкой строкиglue между соседними элементами.
$array = array('lastname', 'email', 'phone');
$separated = implode(",", $array);
echo $separated; // lastname,email,phone
6
7.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Обработка строк
string strip_tags ( string str [, string allowable_tags] ) - возвращает
строку str, из которой удалены HTML и PHP тэги. Необязательный второй
аргумент может быть использован для указания тэгов, которые не
должны удаляться.
string trim ( string str [, string charlist] ) - возвращает строку str с
удаленными из начала и конца строки пробелами. Если второй параметр
не передан, trim() удаляет следующие символы:
" " (ASCII 32 (0x20)), символ пробела.
"\n" (ASCII 10 (0x0A)), перевод строки.
"\0" (ASCII 0 (0x00)), NUL-байт.
"\t" (ASCII 9 (0x09)), символ табуляции.
"\r" (ASCII 13 (0x0D)), возврата каретки.
"\x0B" (ASCII 11 (0x0B)), вертикальная
табуляция.
Можно также задать список символов для удаления с помощью
аргумента charlist. С помощью .. можно задать диапазон символов.
$text = "\t\tЛишь несколько слов :) ... ";
echo trim($text);
// "Лишь несколько слов :) ..."
echo trim($text, " \t."); // "Лишь несколько слов :)"
html_entity_decode -- Преобразует HTML сущности в
соответствующие символы
htmlentities -- Преобразует символы в соответствующие HTML
сущности.
htmlspecialchars_decode -- Преобразует специальные HTMLсущности обратно в соответствующие символы
htmlspecialchars -- Преобразует специальные символы в HTML
сущности
nl2br -- Вставляет HTML код разрыва строки перед каждым
переводом строки
int strcmp ( string str1, string str2 ) - возвращает отрицательное
число, если str1 меньше, чем str2; положительное число,
если str1 больше, чем str2, и 0 если строки равны.
// удалить управляющие символы ASCII из начала и конца
// строки $binary (от 0 до 31 включительно)
$clean = trim($binary, "\x00..\x1F");
7
8.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Получение хеша
string md5 ( string str [, bool raw_output] ) - вычисляет MD5 хэш
string sha1 ( string str [, bool raw_output] ) - возвращает хэш строки
строки str используя алгоритм MD5 RSA Data Security, Inc. и
возвращает этот хэш. Хэш представляет собой 32-значное
шестнадцатеричное число. Если необязательный аргумент
raw_output имеет значение TRUE, то возвращается бинарная строка
из 16 символов.
str, вычисленный по алгоритму US Secure Hash Algorithm 1. Хэш
представляет собой 40-разрядное шестнадцатиричное число. Если
необязательный аргумент raw_output имет значение TRUE, хэш
возвращается в виде двоичной строки из 20 символов.
$password = 'apple';
$password = 'apple';
if (md5($password) === '1f3870be274f6c49b3e31a0c6728957f'){
echo "Пароль верный!";
}
string md5_file ( string filename [, bool raw_output] ) – возвращает
MD5 хэш файла, имя которого задано аргументом filename
if (sha1($password) === '6099a566a619528259db5aa8d7a5aa2d4122259a'){
echo "Пароль верный!";
}
string sha1_file ( string filename [, bool raw_output] ) – возвращает SHA1
хэш файла, имя которого задано аргументом filename
8
9.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Регулярные выражения (расширенные POSIX)
Функции регулярных выражений POSIX:
ereg_replace — Осуществляет замену по регулярному выражению
ereg — Совпадение с регулярным выражением
eregi_replace — Осуществляет замену по регулярному выражению без учета регистра
eregi — Совпадение с регулярным выражением без учёта регистра
split — Разбиение строки на массив по регулярному выражению
spliti — Разбивает строку в массив с помощью регулярного выражения без учета регистра
sql_regcase — Создает регулярное выражение для регистронезависимого сравнения
Замечание:
Так как в PHP 5.3.0 это расширение устарело, вызов любой функции, предоставленной в нем, будет
выдавать уведомление E_DEPRECATED.
Не рекомендую их использование!!!
9
10.
ОСНОВЫ PHPУрок
№11
Урок
№4
Основы PHP
Perl-совместимые регулярные выражения (PCRE)
Регулярное выражение - это шаблон, с которым сравнивается указанная строка слева направо.
Регулярное выражение - это формальный язык поиска и осуществления манипуляций с подстроками в тексте,
основанный на использовании метасимволов.
Проще говоря, регулярное выражение представляет собой набор символов (шаблон), описывающих правило поиска
подстроки. Сравнение производится слева направо.
Синтаксис шаблонов, используемых в функциях этого раздела, во многом похож на синтаксис, используемый в Perl:
• Выражение должно быть заключено в разделители, например, прямые слеши '/'.
• Часто используемыми разделителями являются косые черты (/), знаки решетки (#) и тильды (~).
• Также можно использовать разделитель в виде скобок, где стартовый и завершающий разделители являются
соответственно открывающей и закрывающей скобками. (), {}, [] и <> являются допустимыми парами разделителей.
Пример:
/foo bar/
или
#^[^0-9]$#
или
+php+
или
%[a-zA-Z0-9_-]%
Если символ разделителя встречается в шаблоне, его необходимо экранировать.
После закрывающего разделителя можно указывать различные модификаторы, влияющие на работу регулярных
выражений:
10
11.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Таблица метасимволов
Метасимвол
\d
\D
\s
\S
\w
\W
\n
\r
\t
\xhh
Значение
Цифра (0-9)
Не цифра (любой символ кроме символов 0-9).
Пустой символ (обычно пробел и символ табуляции).
Непустой символ (все, кроме символов, определяемых метасимволом \s).
Все буквы, все цифры и знак подчеркивания (‘_’).
Все, кроме символов, определяемых метасимволом \w.
Символ перевода строки.
Символ возврата каретки.
Символ табуляции
Вставка символа с шестнадцатиричным кодом 0xhh, например \x41 вставит латинскую букву ‘A’.
^
$
|
*
+
?
Начало строки.
Конец строки.
Метасимвол выбора.
Ноль или более символов.
Одно или более символов.
Встречается один раз, либо ноль.
{}
Квантификатор, указывает количество повторений метасимволов. {4,6} (От 4 до 6 повторений).
\A
\Z
\z
\b
\B
\G
Начало строки.
Конец строки.
Конец текста.
Граница слова.
Не граница слова.
Предыдущий успешный поиск.
11
12.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Модификаторы
Модификатор
Описание
i
Шаблон становится регистронезависимым
m
Метасимволы ‘^’ и ‘$’ указывают на начало и конец каждой строки а не всего текста.
s
Метасимвол ‘.’ включает в свое определение перевод строки.
u
Делает все количественные метасимволы “не жадными” .
12
13.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Таблица примитивных полезных символов
Шаблон
[0-9A-Fa-f]
[02468]
[^\d]
/\d\d\d/
[^-0-9]
/^[a-zA-Z0-9]+$/
[^\s]
[^\s.]
foo$
(gif|jpg)
^[a-zA-Z0-9_]{1,}$
(^A-Za-z0-9)
/b(word)b/
Описание
Цифра в шестнадцатеричной системе счисления.
Четная цифра.
Все, кроме цифр.
Трехзначное число.
Любой символ, кроме минуса и цифры.
Строка состоящая только из букв латинского алфавита и цифр.
Все что не пробел.
Все что не пробел и не точка.
Строка заканчивается на “foo”.
Означает как “gif” так и “jpeg”.
Любое слово, хотя бы одна буква, число или “_”.
Любой символ (не число и не буква).
выбор из строки слова “word”.
13
14.
ОСНОВЫ PHPУрок
№11
Урок
№4
Основы PHP
Таблица сложных полезных символов
Шаблон
/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i
Описание
Проверка доменного имени.
Комплексная проверка пароля. Строка не менее шести символов,
/A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z/ цифры, дефисы и подчеркивания, как минимум один символ
верхнего регистра, один нижнего регистра и одна цифра.
[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?[\ .A-Za-z0-9]{2,}
/<title>(.*)</title>/
^\d{1,2}([-. /])\d{1,2}\1\d{2,4}$
Проверка правильности email.
Поиск заголовка страницы.
Разбиваем дату на числа.
(?:8|\+7)? ?\(?(\d{3})\)? ?(\d{3})[ -]?(\d{2})[ -]?(\d{2})
Номер мобильного телефона.
/.*?\./
Получить расширение файла.
/\.(?:exe|msi|dmg|bin|xpi|iso)$/i
Проверка расширения файла.
/<a [^<>]*href=[\'"]([^\'"]+)[\'"][^<>]*>(((?!/si
/^[0-9]{1,55}$/
/([a-zA-Zа-яА-Я]+)/
/^.{1,10}$/
/<b>(.*)</b>/
Внешние ссылки.
Является ли строка числом до 55 цифр.
Разбирает текст на отдельные слова.
Любая строка, содержащая от 1 до 10 символов.
Произвольная последовательность символов, заключенная между
тегами.
14
15.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Функции для работы с регулярными выражениями (Perl-совместимые)
preg_grep -- Возвращает массив вхождений, которые соответствуют шаблону
preg_match_all -- Выполняет глобальный поиск шаблона в строке
preg_match -- Выполняет проверку на соответствие регулярному выражению
preg_quote -- Экранирует символы в регулярных выражениях
preg_replace_callback -- Выполняет поиск по регулярному выражению и замену с использованием функции
обратного вызова
preg_replace -- Выполняет поиск и замену по регулярному выражению
preg_split -- Разбивает строку по регулярному выражению
15
16.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_replace
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int
$limit = -1 [, int &$count ]] ) - поиск в строке subject совпадений с
шаблоном pattern и заменяет их на replacement.
Pattern может быть как строкой, так и массивом строк.
Replacement - строка или массив строк для замены. Если этот параметр
является строкой, а pattern является массивом, все шаблоны будут заменены
этой строкой. Если и pattern и replacement являются массивами, каждый
элемент pattern будет заменен соответствующим элементом из replacement.
Если массив replacement содержит меньше элементов, чем массив pattern, то
все лишние шаблоны из pattern будут заменены пустыми строками.
Если параметр limit указан, будет произведена замена limit вхождений
шаблона; в случае, если limit опущен либо равняется -1, будут заменены все
вхождения шаблона.
Count - если указана, то эта переменная будет заполнена количеством
произведенных замен.
preg_replace() возвращает массив, если параметр subject
является массивом, иначе возвращается строка.
Если найдены совпадения, возвращается новая версия subject,
иначе subject возвращается нетронутым, в случае ошибки
возвращается NULL.
Использование подмасок, за которыми следует цифра:
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
Результат выполнения данного примера:
April1,2003
16
17.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_replace
Замечание:
При использовании массивов в
pattern и replacement, ключи
обрабатываются в том порядке, в
котором они находятся в массиве.
Этот порядок не всегда совпадает
с числовым порядком индексов.
Если вы используете индексы для
сопоставления друг с другом
нужного pattern и replacement, то
вам необходимо прогнать через
функцию ksort() оба массива
перед использованием
preg_replace().
Использование массивов с числовыми индексами в качестве аргументов функции preg_replace()
<?php
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);
?>
Результат выполнения данного примера:
The bear black slow jumped over the lazy dog.
Отсортировав по ключам шаблоны и замены, получаем желаемый результат:
<?php
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);
?>
Результат выполнения данного примера:
The slow black bear jumped over the lazy dog.
17
18.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_replace - замена по нескольким шаблонам
echo '{startDate} = 1999-5-27<br /><br>';
$patterns = array ('/^\s*{(\w+)}\s*=/');
$replace = array ('$\1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
echo '<br><br>';
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/');
$replace = array ('\3/\4/\1\2');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
echo '<br><br>';
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/', '/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
18
19.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_replace
Пример: Чистка пробелов
Этот пример вычищает лишние пробелы в строке.
<?php
$str = 'foo o';
$str = preg_replace('/\s\s+/', ' ', $str);
// Это теперь будет 'foo o'
echo $str;
?>
Пример: Использование параметра count
<?php
$count = 0;
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
echo $count; //3
?>
Результат выполнения данного примера:
xp***to
3
Примечания
19
20.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_replace_callback
mixed preg_replace_callback ( mixed
pattern, callback callback, mixed
subject [, int limit] )
Поведение этой функции во многом
напоминает preg_replace(), за
исключением того, что вместо
параметра replacement необходимо
указывать callback функцию,
которой в качестве входящего
параметра передается массив
найденных вхождений. Ожидаемый
результат - строка, которой будет
произведена замена.
// Этот текст был использован в 2002 году
// мы хотим обновить даты к 2003 году
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// функция обратного вызова
function next_year($matches)
{
// как обычно: $matches[0] - полное вхождение шаблона
// $matches[1] - вхождение первой подмаски, заключенной в круглые скобки, и так далее...
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback("|(\d{2}/\d{2}/)(\d{4})|", "next_year", $text);
// результат:
// April fools day is 04/01/2003
// Last christmas was 12/24/2002
20
21.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_grep
preg_grep - Возвращает массив вхождений, которые соответствуют шаблону
Описание
array preg_grep ( string pattern, array input [, int flags] ) - возвращает массив, состоящий из элементов входящего массива input, которые
соответствуют заданному шаблону pattern.
Параметр flags может принимать следующие значения:
PREG_GREP_INVERT - В случае, если этот флаг установлен, функция preg_grep(), возвращает те элементы массива, которые не соответствуют
заданному шаблону pattern.
Результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных. Если такое поведение вам не
подходит, примените array_values() к массиву, возвращаемому preg_grep() для переиндексации.
// Возвращает все элементы массива,
// содержащие числа с плавающей точкой
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
21
22.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_match
mixed preg_match ( string pattern, string subject [, array &matches
[, int flags [, int offset]]] ) - ищет в заданном тексте subject
совпадения с шаблоном pattern
В случае, если дополнительный параметр matches указан, он
будет заполнен результатами поиска. Элемент $matches[0]
будет содержать часть строки, соответствующую вхождению
всего шаблона, $matches[1] - часть строки, соответствующую
первой подмаске, и так далее.
flags может принимать следующие значения:
PREG_OFFSET_CAPTURE - если этот флаг указан, для каждой
найденной подстроки будет указана ее позиция в исходной
строке. Необходимо помнить, что этот флаг меняет формат
возвращаемых данных: каждое вхождение возвращается в
виде массива, в нулевом элементе которого содержится
найденная подстрока, а в первом - смещение.
Поиск осуществляется слева направо, с начала строки.
Дополнительный параметр offset может быть использован для
указания альтернативной начальной позиции для поиска.
Поиск подстроки "php" в тексте:
if(preg_match("/php/i", "PHP is the web scripting language of choice.", $mass)){
echo "We found it.";
} else {
echo "NO NO NO";
}
// Символ "i" после закрывающего ограничителя шаблона означает
// регистронезависимый поиск.
Извлечение доменного имени из URL:
// Извлекаем имя хоста из URL
preg_match("/^(http:\/\/)?([^\/]+)/i", "http://www.php.net/index", $matches);
$host = $matches[2];
// извлекаем две последние части имени хоста
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "domain name is: {$matches[0]}\n";
22
23.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_match_all
int preg_match_all ( string pattern, string subject, array &matches [, int flags [, int offset]] )
- ищет в строке subject все совпадения с шаблоном pattern и помещает результат в
массив matches в порядке, определяемом комбинацией флагов flags.
После нахождения первого соответствия последующие поиски будут осуществляться
не с начала строки, а от конца последнего найденного вхождения.
Дополнительный параметр flags может комбинировать следующие значения :
PREG_PATTERN_ORDER (используется по умолчанию) - результат будет упорядочен
следующим образом: элемент $matches[0] содержит массив полных вхождений
шаблона, элемент $matches[1] содержит массив вхождений первой подмаски, и так
далее.
PREG_SET_ORDER - результат будет упорядочен следующим образом: элемент
$matches[0] содержит первый набор вхождений, элемент $matches[1] содержит
второй набор вхождений, и так далее.
PREG_OFFSET_CAPTURE - для каждой найденной подстроки будет указана ее позиция
в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемых
данных: каждое вхождение возвращается в виде массива, в нулевом элементе
которого содержится найденная подстрока, а в первом - смещение.
Поиск осуществляется слева направо, с начала
строки. Дополнительный параметр offset может
быть использован для указания альтернативной
начальной позиции для поиска.
Пример:
Получение всех телефонных номеров из текста:
preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}\d{4}/x", "Call 555-1212 or 1-800-555-212", $phones);
Проверяем, является ли переменная числом
if (!preg_match("|^[\d]+$|", $var)){ … }
23
24.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Отличие «preg_match» от «preg_match_all»
Разница заключается в том, что «preg_match» ищет только до первого совпадения с маской поиска. Как
только что-то найдено, поиск останавливается. Так же разница в выдаваемом результате. «preg_match»
возвращает одномерный массив.
Вот пример.
if (preg_match('|<title>(.+?)</title>|isU', $sContent, $arr)){
return $arr[1];
}
else {
return false;
}
В этом случае нулевой элемент массива «$arr» содержит найденное совпадение вместе с тегами «title», а
первый элемент - «$arr[1]» только текст между этими тегами. И не путайте, если в искомом коде
несколько тегов «title», это не значит что остальные значения будут записаны в «$arr[2]» и так далее. В
случае с «preg_match» поиск идет только до первого найденного совпадения, а элемент «$arr[2]»
окажется не пуст, только если в маске указано несколько правил.
24
25.
ОСНОВЫ PHPУрок
№11
Урок
№4
Основы PHP
preg_match_all
Жадный поиск совпадений с HTML-тэгами:
Результат:
// Запись является примером использования ссылок на подмаски.
// Она означает необходимость соответствия подстроки строке, зафиксированной
// второй подмаской, в нашем примере это ([\w]+).
// Дополнительный слеш необходим, так как используются двойные кавычки.
matched: <b>bold text</b>
part 1: <b>
part 2: bold text
part 3: </b>
$html = "<b>bold text</b><a href=howdy.html>click me</a>";
preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: " . htmlspecialchars($matches[0][$i]) . "<br />";
echo "part 1: " . htmlspecialchars($matches[1][$i]) . "<br />";
echo "part 2: " . htmlspecialchars($matches[3][$i]) . "<br />";
echo "part 3: " . htmlspecialchars($matches[4][$i]) . "<br /><br />";
}
matched: <a href=howdy.html>click me</a>
part 1: <a href=howdy.html>
part 2: click me
part 3: </a>
25
26.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_quote
string preg_quote ( string str [, string delimiter] ) - принимает строку str и добавляет обратный слеш перед каждым служебным символом.
Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может
меняться.
В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. Это удобно для экранирования ограничителя,
который используется в PCRE функциях. Наиболее распространенным ограничителем является символ '/'.
В регулярных выражениях служебными считаются так же следующие символы:
. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :
$keywords = "$40 for a g3/400";
$keywords = preg_quote($keywords, "/");
echo $keywords;
// возвращает \$40 for a g3\/400
26
27.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
preg_quote
Выделение курсивом слова в тексте
// В данном примере preg_quote($word) используется, чтобы
// избежать трактовки символа '*' как спец. символа.
$textbody = "This book is *very* difficult to find.";
$word = "*very*";
$textbody = preg_replace ("/" . preg_quote($word) . "/",
"<i>" . $word . "</i>",
$textbody);
27
28.
ОСНОВЫ PHPУрок
№11
Урок
№4
Основы PHP
preg_split
array preg_split ( string pattern, string subject [, int limit [, int flags]] ) возвращает массив, состоящий из подстрок заданной строки subject,
которая разбита по границам, соответствующим шаблону pattern.
Если параметр limit указан, функция возвращает не более, чем limit
подстрок. Специальное значение limit, равное -1, подразумевает отсутствие
ограничения, это весьма полезно для указания еще одного опционального
параметра flags.
flags может быть произвольной комбинацией следующих флагов
(соединение происходит при помощи оператора '|'):
PREG_SPLIT_NO_EMPTY - функция preg_split() вернет только непустые
подстроки.
PREG_SPLIT_DELIM_CAPTURE - выражение, заключенное в круглые скобки в
разделяющем шаблоне, также извлекается из заданной строки и
возвращается функцией.
PREG_SPLIT_OFFSET_CAPTURE - для каждой найденной подстроки, будет
указана ее позиция в исходной строке. Необходимо помнить, что этот флаг
меняет формат возвращаемых данных: каждое вхождение возвращается в
виде массива, в нулевом элементе которого содержится найденная
подстрока, а в первом - смещение.
Получение подстрок из заданного текста:
// разбиваем строку по произвольному числу запятых и пробельных
//символов, которые включают в себя " ", \r, \t, \n и \f
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
Разбиваем строку на составляющие символы:
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
Получим:
Array (
[0] => s
[1] => t
[2] => r
[3] => i
[4] => n
[5] => g
)
28
29.
ОСНОВЫ PHPУрок
№11
Урок
№4
Основы PHP
preg_split
На выходе получаем:
Разбиваем строку с указанием смещения для каждой из найденных
подстрок:
<?php
$str = 'hypertext language programming';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
?>
Array
(
[0] => Array
(
[0] => hypertext
[1] => 0
)
[1] => Array
(
[0] => language
[1] => 10
)
[2] => Array
(
[0] => programming
[1] => 19
)
)
29
30.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
Полезные ресурсы
http://lifeexample.ru/php-primeryi-skriptov/regulyarnyie-vyirazheniya-v-php.html - простая статья о
регулярках
http://www.skillz.ru/dev/php/article-Regulyarnye_vyrazheniya_dlya_chaynikov.html - регулярки для
чайников
http://archive-ipq-co.narod.ru/l1/regexp.html - подробно по регулярным выражениям
Примеры популярных выражений:
https://htmlweb.ru/php/example/preg.php
http://tradebenefit.ru/art?id=143
30
31.
ОСНОВЫ PHPОсновы PHP
Урок
№11
Урок
№4
ДЗ
1) Написать функцию с помощью которой обрабатывать все отзывы на предмет содержания
нецензурной лексики, заменяя её на * в случае если в отзыве не более 3х слов. Если в
текст более 3х нецензурных выражений – не публиковать такой отзыв.
2) Написать функцию, которая будет копировать все телефонные номера из отзывов в
отдельную таблицу в базе данных.
3) Написать функцию, которая будет копировать все e@mail адреса из отзывов в отдельную
таблицу в базе данных.
31