Регулярные выражения. Метасимвол точка
От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных теме регулярных выражений и в этой статье мы познакомимся с одним из наиболее популярных метасимволов в регулярных выражениях — это символ точка. Начнем?
Начнем сразу с того, что же означает символ точки в регулярных выражениях. В шаблоне регулярного выражения точка совпадает с любым символом, кроме перевода строки (по умолчанию). Если мы хотим, чтобы точка совпадала также и с символом перевода строки, в PHP мы можем использовать модификатор шаблона s.
Давайте сразу перейдем к примерам. Напишем несколько произвольных строк текста и используем точку в шаблоне.
Как видим, точка действительно совпадает с любым символом: буквы, цифры, пробел, точка, запятая и т.д. При этом точка совпадает с одним символом, но благодаря модификатору g поиск не ограничивается первым совпадением и продолжается дальше. В итоге найдено 21 совпадение (количество совпадений можно увидеть в правом верхнем углу сервиса regexr.com).
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
Если мы добавим квантификатор + после точки, то тем самым зададим поиск совпадающих символов от одного до бесконечности.
Теперь найдено 3 совпадения (по количеству строк). Поскольку точка не совпадает с символом перевода строки, шаблон найдет совпадение до конца строки.
А что, если мы хотим найти именно точку? Как быть в таком случае? Здесь есть два варианта. Первый — использование символа экранирования, которым является обратный слеш (\). Указав слеш перед метасимволом, мы тем самым экранируем метасимвол и он будет трактоваться, как обычный символ, т.е. в данном случае, как просто точка.
Теперь найдена только точка. Другой вариант — поместить точку в символьный класс, где она рассматривается как обычный символ:
Ну и в качестве практики давайте напишем простейший шаблон регулярного выражения, который будет валидировать адреса email. Сразу оговорюсь, что этот шаблон не будет иметь учебный характер и не предназначен для валидации всех возможных вариантов email, но для большинства адресов он вполне сгодится.
Все работает. Обратите внимание, точка перед последней частью доменного имени экранирована. Это сделано для того, чтобы она воспринималась именно как точка. Если же мы уберем экранирующий слеш, тогда точка будет совпадать с любым символом и наш шаблон пропустит некорректный email:
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
На этом мы будем завершать сегодняшнюю статью. Больше о регулярных выражениях вы можете узнать из нашего курса по регулярным выражениям. Удачи!
Популярные примеры работы регулярных выражений в 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|2)|r(?:ar|9)|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]7)[- \\\\)]((8[-
]7[- ]1)|(6[- ]7[- ]9)|(5[-
]9[- ]8)|(6[- ]9[- ]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);