- Регулярные выражения в PHP часть 1 (preg_replace)
- Операторы повторения
- Ограничение жадности
- Группирующие круглые скобки
- Квадратные скобки
- Экранировка спецсимволов
- Ограничители
- Замена символов по регулярному выражению
- Замена повторяющихся пробелов на один
- Замена 4х пробелов на tab
- Замена точек на многоточие
- Замена повторяющихся знаков препинания
- Комментарии
- Другие публикации
- Популярные примеры работы регулярных выражений в PHP
- Примеры preg_replace PHP
- Примеры preg_match PHP
- Примеры ereg PHP
Регулярные выражения в PHP часть 1 (preg_replace)
Регулярные выражения в PHP — это мощный инструмент, который в умелых руках может творить чудеса. Знание регулярных выражений не слишком важно для создания сайтов, потому что они довольно редко встречаются в проектах. Но некоторые особо важные функции просто невозможно сделать без них. Поэтому стоит хотя бы ознакомиться с темой.
Пользуйтесь регулярными выражениями только в том случае, если нет никакого другого способа решения задачи.
Типичная жизненная ситуация:
У программиста была одна проблема. Он решил эту проблему с помощью регулярного выражения. Теперь у программиста есть две проблемы!
Регулярные выражения лучше всего начать изучать с функции preg_replace. Эта функция очень похожа по своей функции на str_replace, которая заменяет часть строки на другую строку. Только на первым параметром функции preg_replace является регулярное выражение. Попробуем сравнить их простейшее использование
- «i» означает отключение чувствительности к регистру искомого символа
- «u» означает, что нужно включить в функции preg_replace поддержку UTF-8 кодировки. Иначе кириллица будет обрабатываться неправильно
ТиШе, мыШи, кот на крыШе ТиШе, мыШи, кот на крыШе
Но сила регулярных выражений в том, что в искомой строке можно задавать символы-команды. Приведём пример: буквы и цифры внутри регулярного выражения будут искаться и заменяться как есть, но символ точки «.» буде восприниматься как любой символ. То есть:
Тише, МЫШИ, кот на крыше Тише, мыши, кот на сыре
Операторы повторения
- + — символ повторяется один или более раз
- * — символ повторяется ноль или более раз
- ? — символ повторяется ноль или один раз. То есть может присутствовать или нет
Ограничение жадности
Регулярное выражение захватывает максимально возможное количество символов. Поэтому результат может быть неожиданным. К примеру. предположим, что нам надо заменить в строке «Тише, мыши, кот на крыше» слово «Тише» на «Громче». Для этого используем выражение:
Может показаться, что выражение сработает правильно. Но по факту оно найдёт букву «Т» в начале строки и букву «е» не в конце первого слова, а в конце всей строки. Результат получится такой:
Чтобы этого не происходило, необходимо ограничить жадность регулярного выражения. Для этого необходимо после оператора повторения (звёздочки «*» или плюса «+») поставить знак вопроса «?», чтобы они перестали быть такими жадными.
Группирующие круглые скобки
Как было сказано ранее, операторы повторения работают только на символ, который стоит до них. Если же необходимо применить оператор повторения на несколько символов, то необходимо поставить скобки. Приведём пример:
Из кода видно, что оператор повторения будет применяться к двум символам, стоящим в круглых скобках — (ыш). Результат выполнения такого кода:
Квадратные скобки
Существуют квадратные скобки. Если круглые являются «группирующими», или в терминах логики они делают соединение «и», то квадратные скобки — это логическое «или». Приведём пример:
В результате выполнения этого кода все буквы «н», «ш», «р», которые стоят в квадратных скобках [ншр] будут заменены на восклицательный знак «!».
Существует ещё возможность сделать отрицание в квадратных скобках. Тогда будут заменены все символы, которые в них не попали. Это делается с помощью значка возведения в степень «^»:
- [а-я] — все строчные буквы
- [а-д] — строчные буквы от «а» до «д»: а, б, в, г, д
- [а-яА-Я] — все строчные и заглавные буквы
- 3 — все цифры
- 4 — цифры: 4, 5, 6, 7
Экранировка спецсимволов
Не являются спецсимволами:
@ : , ‘ » ; — _ = < >% # ~ `& ! /
К примеру, необходимо заменить все знаки «+» в строке. Но в регулярном выражении «+» является оператором повторения. Чтобы снять с него все функции и сделать простым символом, как буквы или цифры, необходимо поставить перед ним знак падающего слеша «\», чтобы получилось «\+»:
В таком случае говорят, что знак «+» экранирован, поэтому не воспринимается как спецсимвол. Результат будет таким:
Ограничители
По бокам регулярного выражения мы ставили ограничители «#». Но ограничителем может быть не только символ решётки, но и другие спецсимволы. К примеру: «/», «&» и даже скобки «(» . «)». Всё зависит от того, что мы хотим использовать внутри выражения. Если будет использована решётка, то внутри её придётся экранировать. Но если поставить ограничители «&», то решётку внутри них не придётся экранировать:
Тише, мыши, кот на крыше Тише, мыши, кот на крыше
Замена символов по регулярному выражению
Замена символов и строк по регулярному выражению при помощи PHP функции preg_replace() .
Замена повторяющихся пробелов на один
$text = 'Многие известные личности и по сей день'; echo preg_replace("/[ ]+/", ' ', $text);
Многие известные личности и по сей день
Замена 4х пробелов на tab
Выражение заменяет четыре пробела на табуляцию в начале всех строк.
$text = ' My text has somuch whitespace'; echo preg_replace('/(?:^|\G)(\t|[ ])/m', "\t", $text);
My text has somuch whitespace
Замена точек на многоточие
$text = 'Многие известные личности и по сей день. '; echo preg_replace('/\./', '…', $text);
Многие известные личности и по сей день…
Замена повторяющихся знаков препинания
$text = 'Многие известные. личности и по сей день. Современные. технологии достигли. '; echo preg_replace("/(\.|,|!|\?)+/", '\\1', $text);
Многие известные. личности и по сей день, Современные? технологии достигли!
Комментарии
Другие публикации
Для форматирования текста иногда требуется заменить все кавычки в тексте на французские «ёлочки», сделать это можно с.
Для предотвращения XSS, SQL-инъекций и других атак, данные полученные из форм нужно чистить. Простое экранирования кавычек не достаточно, нужен комплексный подход по типу данных.
Популярные примеры работы регулярных выражений в PHP
Вопросов по данной теме уйма. И я решил создать свою подборку регулярных выражений. Думаю многим поможет!
Для справки. . — (точка) соответствует любому символу. <> — (фигурные скобки) нужны для обозначения количества необходимых символов. Например, w — три буквы w подряд. Также есть диапозон z, то есть z может повторяться от 2 до 5 раз. | — (вертикальная черта) логическое или в регулярных выражениях. \n — перевод строки \r — так же перевод строки \t — табуляция \d — цифра \D — только не цифра \s — пробел \S — только не пробел \w — все буквы, цифры и знак подчеркивания "_" \W — только не буква, цифра или подчеркивание Модификаторы в конце выражения /i — делает поиск по выражению регистронезависимым. Нет разницы между заглавным и прописным символом /U — модификатор указывает на то, что результатом поиска должен быть самый короткий отрывок, удовлетворяющий маске поиска. Рекомендую всегда использовать данный модификатор /m — этот модификатор позволяет искать отрезок текста только внутри одной строки /s — поиск идёт всему тексту, не обращая внимания на переносы строк /x — игнорируются пробельные символы, в том числе символы табуляции и перевода строки |
Примеры preg_replace PHP
1. Удаляем определённую ссылку в переменной text
2. Удаляем комментарии в переменной text
$text = preg_replace('##sUi', '', $text);
3. Удаляем спецсимволы
$text = preg_replace('/(<([^>]+)>)/U', '', $text);
5. Удаляем всё, что между
$text = preg_replace('##is', '', $text);
6. Удаляем конкретные символы из строки
$text = str_replace('#39;', '', $text); // удаляем одинарные кавычки
$text = str_replace('"', '', $text); // удаляем двойные кавычки
$text = str_replace('&', '', $text); // удаляем амперсанд
$text = preg_replace('/([. ^~|@№$–=+*&%.,;\[\]<>()_—«»#\/]+)/', '', $text); // удаляем недоспустимые символы
7. Удаляем пробелы по бокам строки и обычные пробелы
$text = trim($text); // удаляем пробелы по бокам
$text = preg_replace('/ /', '', $text); // чистим обычные пробелы
$text = preg_replace("/ +/", " ", $text); // множественные пробелы заменяем на одинарные
8. Удаляем лишние переводы строк и переносы
$text = preg_replace("/(\r\n)/", "\r\n\r\n", $text); // убираем лишние переводы строк (больше 1 строки)
9. Удаляем расширения в названиях файлов
$file = 'image.jpg';
$file = preg_replace("/.*?\./", '', $file); // выведет image
10. Создаём функцию обработки текста
function ProcessText($text)
$text = trim($text); // удаляем пробелы по бокам
$text = stripslashes($text); // удаляем слэши
$text = htmlspecialchars($text); // переводим HTML в текст
$text = preg_replace("/ +/", " ", $text); // множественные пробелы заменяем на одинарные
$text = preg_replace("/(\r\n)/", "\r\n\r\n", $text); // убираем лишние переводы строк (больше 1 строки)
$test = nl2br ($text); // заменяем переводы строк на тег
$text = preg_replace("/^\"([^\"]+[^=> <])\"/u", "$1«$2»", $text); // ставим людские кавычки
$text = preg_replace("/(«)/","«",$text); // убираем лишние левые кавычки (больше 1 кавычки)
$text = preg_replace("/(»)/","»",$text); // убираем лишние правые кавычки (больше 1 кавычки)
$text = preg_replace("/(\r\n)/u", "", $text); // ставим абзацы
return $text; //возвращаем переменную
>
11. Найти содержимое определённого тега и вставить его в другие теги
$string = preg_replace("!!si","<НОВЫЙ_ТЕГ>\\1НОВЫЙ_ТЕГ>",$string);
12. Удаляем многократно повторяющиеся знаки препинания (например, . или . )
$text = preg_replace('#(\.|\?|!|\(|\))#', '\1\1\1', $text);
13. Добавить или убрать текст в начале или конце переменной с текстом
$string = preg_replace("/^/", "Начало: ", $string); // в начало
$string = preg_replace("/$/", " читать далее. ", $string); // в конец
14. Находим все http:// и заменяем на ссылки
15. Удаление GET-параметров из URL
16. Добавить тег br в начало или конец строк
$string = preg_replace("/^/", "
", $string); // в начало всех строк
$string = preg_replace("/$/", "
", $string); // в конец всех строк
17. Как конвертировать html в текст
// $document на выходе должен содержать HTML-документ.
// Необходимо удалить все HTML-теги, секции javascript,
// пробельные символы. Также необходимо заменить некоторые
// HTML-сущности на их эквивалент.
$search = array ("''si", // Вырезает javaScript
"'<[\/\!]*?[^<>]*?>'si", // Вырезает HTML-теги
"'([\r\n])[\s]+'", // Вырезает пробельные символы
"'&(quot|#34);'i", // Заменяет HTML-сущности
"'&(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"); // интерпретировать как php-код
$replace = array ("",
"",
"\\1",
"\"",
"&",
" ">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");
$text = preg_replace($search, $replace, $document);
18. Как разобрать email и сделать ссылку
Примеры preg_match PHP
1. проверка mail адреса на корректность
if (!preg_match("/^[a-zA-Zа-яА-ЯёЁ_\d][-a-zA-Zа-яА-ЯёЁ0-9_\.\d]*\@[a-zA-Zа-яА-ЯёЁ\d][-a-zA-Zа-яА-ЯёЁ\.\d]*\.[a-zA-Zа-яА-Я]$/i", $email)) exit("Неправильный адрес");
2. Найти mail адреса в тексте
// \S означает "не пробел", а [a-z0-9.]+ -
// "любое число букв, цифр или точек". Модификатор 'i' после '/'
// заставляет PHP не учитывать регистр букв при поиске совпадений.
// Модификатор 's', стоящий рядом с 'i', говорит, что мы работаем
// в "однострочном режиме" (см. ниже в этой главе).
preg_match('/(\S+)@([а-яА-ЯёЁa-zA-Z0-9.]+)/is', "Привет от somebody@mail.ru!", $p);
// Имя хоста будет в $p[2], а имя ящика (до @) - в $p[1].
echo "В тексте найдено: ящик - $p[1], хост - $p[2]";
3. Является ли переменная числом, длиной от 13 до 16 символов (проверка кредитной карты)
4. Проверка имени файла
if (preg_match("/(^[a-zA-Z0-9]+([a-zA-Z\_0-9\.-]*))$/" , $filename)==NULL) echo "invalid filename";
exit;
>
/\.(?:z(?:ip|1)|r(?:ar|4)|jar|bz2|gz|tar|rpm)$/i
/\.(?:mp3|wav|og(?:g|a)|flac|midi?|rm|aac|wma|mka|ape)$/i
/\.(?:mpeg|ra?m|avi|mp(?:g|e|4)|mov|divx|asf|qt|wmv|m\dv|rv|vob|asx|ogm)$/i
5. Ищем в тексте мобильные телефоны РФ
preg_match_all('/(8|7|\+7)[- \\\\(]([9]1)[- \\\\)]((7[-
]6[- ]4)|(8[- ]7[- ]6)|(4[-
]3[- ]8)|(8[- ]8[- ]3))/',
$text, $regs );
6. Состоит ли строка только из букв, цифр и _, длиной от 8 до 20 символов:
if (preg_match("/^[a-zа-я0-9_]$/",$string)) echo "yes"; else echo "no";
7. Есть ли в строке идущие подряд символы, не менее 3-х символов подряд (типа абвгДДДеё, но не ааббаабб):
if (preg_match("/(.)\\1\\1/",$string)) echo "yes"; else echo "no";
8. Поиск в разных частях строки конструкции:
preg_match("/abc/", $string); // true если найдёт в любом месте
preg_match("/^abc/", $string); // true если найдёт в начале
preg_match("/abc$/", $string); // true если найдёт в конце
9. Проверки на тип браузера. Возвращает true если browser = Netscape 2, 3 or MSIE 3.
preg_match("/(ozilla.[23]|MSIE.3)/i", $_SERVER["HTTP_USER_AGENT"]);
Примеры ereg PHP
1. Проверка mail адреса в тексте
ereg("^[а-яА-ЯёЁa-zA-Z0-9_]+@[а-яА-ЯёЁa-zA-Z0-9\-]+\.[а-яА-ЯёЁa-zA-Z\-\.]+$]", $email);