preg_match("шаблон_поиска", "строка_в_которой_проводится_поиск",
массив_с_результами_поиска)
символьные классы [ ] описывают 1 символ.
Квантификаторы { } ставятся после классов [ ]
показывают количество итераций {},*,+,? литералов
Жадные квантификации
*; ?; +; {n,}
Ревнивые квантификации
*+; ?+; ++; {n,}+
группировка ( ) ставит приоритет операций
спец символ - позиция внутри строк, ставится в шаблоне
\Ba\B
; a\b; a$
; ^a; \Ga
^, $ – начало и конец
\b – граница слова (а\b – буква а вконце)
\B – не граница слова
\G – предыдущий успешный поиск
Запоминание
( ) – в скобки запоминается результат, он выводится в результате \1 либо $1
Пример
“([1-8]{4})”, $string, “this result: \\1” – выводит 4е цифры в результат
“([a-z]{2})([1-8]{4})”, $string, “this result: \\1 \\2 вся строка \\0” – выводит 2е буквы потом 4е цифры и вконеце пишет всю строку заменяя \\0
СИМВОЛЬНЫЕ КЛАССЫ
Интервалы или символьные классы
указываются через дефис [a-b] можно так [a-ds-l] можно [1-2d-s]
Перечисления как символьный класс
символов просто в кВ скобках [abcdefg] или [dsgj4691]
Совмещение перечислений и интервалов
[a-d3214-6] – от а до d 3,2,1 и с 4 до 6.
Группа литералов
Пишется в скобках
Пример:
(string\sfirst\sok) будет три слова через пробелы.
Символьное отрицание
[^ крышка в квадратных скобках, обязательно вторая позиция, иначе крышка будет обычным литералом.
Примеры:
[^abs] – символ не а не b и не s
[^abs]{3} – три символа не b,a,s
[^ab^s]{3} – три символа не b,a,s тут используется литерал крышка перед s
Повторение (квантификация)
{цифра, цифра}
* - любое количество символов
Примеры:
[4-7]{3} – три цифры от 4 до 7 ;
[a-d]{2,7} – минимум 2е максимум 7 символов от а до d
[d-z]{2,} – минимум 2а символа от d до z
[d-z]+ - должен быть по карайней мере один символ тоже самое что и {1,}
Начало и конец СТРОКИ
^ начало строки
$ конец строки
Условия
указываются в квадратных скобках,
\s – пробел табулятор или перевод строки
\S – все что не входит в \s
\w – слово, в него входят все символы примерно такие [a-zA-Z]
\W – все что не входит в \w
\d – все цифры
\D – все что не входит в \d
. – все символы это точка
\. – символ точка перед ней ставить обратный слеш
В классе [.] точка как символ или как литерал
Разделители
Используются для того чтобы показать где начинаются/заканчиваются условия, или то что является регулярным вырожением, это могут быть разные символы, главное чтоб они были идентичными.
Пример
preg_match("/^[a-z0-9]/", $string,$mathces);
preg_match("/^[a-zA-Z0-9]+$/", $user)) условие при регистрации
плюс означает минимум один символ
примеры:
^[a-zA-Z][a-zA-Z0-9]*$ первый символ, второй может быть или нет любое количество раз
^$ - говорит о том что условие выполняется для всей строки
Оператор выбора
| выбирать можно между литералами или группами литералов
Пример:
preg_match("/^(be)|(not\sto\sbe)$/", $alternate, $answer);
s(o|u)n это будет son или sun
чтобы отменить запоминание скобок, чтобы они не запоминали в память ничего
нужно указать последовательность ?:
пример
(?:be)|(?:not\sto\sbe)
Фамилия имя отчество preg_match("/([^\s]+)\s+([^\s.])[^\s.]*(?:\s|\.)([^\s.])[^\s.]*/",$income_str,$out_arr);
* [^\s] - любой символ, который не является пробелом! включая символ
новой строки, можно было написать \S без крышки вначале
символьного класса, но это на любителя.
* [^\s]+ - минимум один символ, который не является пробелом, т.е.
фамилию мы уже описали.
* \s+ - минимум один пробел между фамилией и именем
* [^\s] - все что не пробел, первый обязательный символ имени
(сокращения)
* [^\s.] - все что не пробел и не точка, в символьном классе точка -
литерал
* [^\s.]* - в случае полного имени, это будет означать, что надо
найти все, что не точка и не пробел и идет после обязательного
первого символа имени, который мы описали выше
Позитивные и негативные проверки
Ретроспективная проверка
(?<=) позитивная ретроспектива
(?<!) негативная ретроспектива
Опережающая проверка
(?=) позитивная опережающая проверка
(?!) негативная опережающая проверка
После ? идет символ который описывает действие
пример
(?=) справа от знака значит строка справа должна совпасть с выражением в скобках
(?<!<TD>) перед ценой не должно стоять <TD> (негативная ретроспектива)
(?!<\/B>) справа от цены недолжно быть тега </B>
preg_match_all("/(?<!<TD>)(?<=>)\d*\.\d*(?!<\/B>)(?=<\/A>)/", $string, $matches);
Жадные и ленивые квантификаторы
*? – это ленивый
!<div id='laiko_sriftas'>(.*?)</div>!
Возвращается массив [1] здесь внутренние значение [0] здесь строка целая
if (preg_match("!<title>(.*?)</title>!si",$string,$ok))
echo "Тег найден, текст: $ok[1]";
else
echo "Тег не найден";
$ok[0] будет строки вместе с тегами <title></title>
$ok[1] будут все строки внутри тегов <title></title>
Здесь используется ленивая квантификация,
Мне нужно было выделить заголовки и время в тексте где встречалось слово Фильм и Сериал:
06:00 "Неизвестная планета": "Вьетнам: путешествие в страну девяти драконов"
06:30 "Новости 24 - Набережные Челны"
06:45 "РЕНтабельные ЛЮДИ"
07:00 "Экстренный вызов"
07:30 "Званый ужин" ФильМ
08:30 "Солдаты - 6" Комедийный сериал
09:30 "Новости 24"
10:00 "Честно": "Продам себя по частям"
11:00 "Час суда с Павлом Астаховым"
12:00 "Экстренный вызов"
12:30 "Новости 24"
13:00 "Званый ужин"
14:00 "Давай попробуем?"
15:00 "Час суда с Павлом Астаховым"
16:00 "Экстренный вызов"
16:30 "Новости 24"
17:00 "Улицы разбитых фонарей. Новые приключения ментов" Сериал
18:00 "Экстренный вызов"
18:30 "Честно": "Жилье-жулье"
19:30 "Новости 24 - Набережные Челны"
20:00 "Громкое дело"
20:30 ПРЕМЬЕРА. "Черкизона. Одноразовые люди" Сериал
21:30 "Дорогая передача"
22:30 "Справедливость"
23:30 "Новости 24 - Набережные Челны"
00:00 "Честно": "Жилье-жулье"
01:00 "Кино": Куба Гудинг-младший, Том Беренджер в триллере "Убийство ворон" (США)
02:55 "Покер-Дуэль"
03:45 "Морская душа" Сериал
04:40 "Детективные истории": "Секрет криминалиста"
05:15 "Неизвестная планета": "Вьетнам: путешествие в страну девяти драконов"
05:40 Ночной музыкальный канал
11 ИЮНЯ, ПЯТНИЦА
06:00 "Неизвестная планета": "Безобразие красоты"
06:30 "Новости 24 - Набережные Челны"
07:00 "Экстренный вызов"
07:30 "Званый ужин"
08:30 "Солдаты - 6" Комедийный сериал
09:30 "Новости 24"
10:00 "Честно": "Жилье-жулье"
11:00 "Час суда с Павлом Астаховым"
12:00 "Экстренный вызов"
12:30 "Новости 24"
13:00 "Званый ужин"
14:00 "Давай попробуем?"
15:00 "Час суда с Павлом Астаховым"
16:00 "Экстренный вызов"
16:30 "Новости 24"
17:00 "Улицы разбитых фонарей. Новые приключения ментов" Сериал
18:00 "Экстренный вызов"
18:30 "Честно": "Родившие вопреки"
19:30 "Новости 24 - Набережные Челны"
20:00 "Громкое дело"
20:30 "Кино": Арнольд Шварценеггер в боевике "Шестой день" (США)
22:50 "Фантастика под грифом "Секретно": "Чудеса. Доказательств не требуется"
23:30 "Новости 24 - Набережные Челны"
реализовал так:
([^\:][0-9]{2}\s(.*))
([0-9]{2}:[0-9]{2})
preg_replace("/(\B[^\:][0-9]{2}\s(.*))/","<b><span style=\"background-color:#0FF\">\\1</span></b>",$this->input->post('text'));
и
nl2br(preg_replace("/([0-9]{2}:[0-9]{2})(?=.*Сериал|.*фильм)/i","<b><span style=\"background-color:#0FF\">\\1</span></b>",$r));
а потом ввел все в одну функцию так:
nl2br(preg_replace("/(([0-9]{2}:[0-9]{2})(?=.*Сериал|.*фильм)|(\B[^\:][0-9]{2}\s(.*)))/i","<b><span style=\"background-color:#0FF\">\\1</span></b>",$r));
Где:
/i - ключ не учитывать регистр
{} – квантификатор повторение цифр по два раза
\: – символ двоеточия в классе
\B – не начало строки
(?=) – просмотр вперед или назад в моем случае выражение слева это при встрече слова Сериал просмотр позитивный просмотр вперед времени.
(()|()) сохраняется только одно из двух значений одна скобка – один результат который выводится в \\1
для InDesing регулярные выражения выглядят так:
1) ([0-9]{2}:[0-9]{2})(?=.*сериал|.*фильм) (?i)
3) ([0-9]{2}.[0-9]{2})(?=.*сериал|.*Фильм) (?i)
2) (^[0-9]{2} (.*))
(?i) – режим не учитывающий регистр
так можно легко изменять все что угодно
Комментарии
Отправить комментарий