синтаксис регулярных выражений php

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

Что такое Регулярные выражения?

Регулярное выражение может быть одиночным символом или более сложным шаблоном.

Регулярные выражения могут использоваться для выполнения всех типов текстового поиска и операций замены текста.

Синтаксис Регулярных выражений в PHP

В качестве разделителя может использоваться любой символ, кроме буквы, числа, обратного слэша или пробела. Наиболее распространенным разделителем является слэш (/), но когда ваш шаблон содержит слэши, лучше выбрать другие разделители, такие как # или

Функции регулярных выражений

Функция Описание
preg_match() Возвращает 1, если шаблон был найден в строке, и 0, если нет
preg_match_all() Возвращает, сколько раз шаблон был найден в строке, которое также может быть 0
preg_replace() Возвращает новую строку, в которой совпадающие шаблоны были заменены другой строкой

Использование preg_match()

Функция preg_match() сообщит вам, содержит ли строка совпадения с шаблоном.

Пример

Используйте регулярное выражение для поиска «w3schools» в строке без учета регистра:

Использование preg_match_all()

Функция preg_match_all() сообщит вам, сколько совпадений было найдено для шаблона в строке.

Пример

Используйте регулярное выражение для подсчета без учета регистра числа вхождений «ain» в строке:

Использование preg_replace()

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

Пример

Используйте регулярное выражение без учета регистра, чтобы заменить Microsoft на W3Schools в строке:

Модификаторы регулярных выражений

Модификаторы могут изменить способ выполнения поиска.

Модификатор Описание
i Выполняет поиск без учета регистра
m Выполняет многострочный поиск (шаблоны, которые ищут начало или конец строки, будут соответствовать началу или концу каждой строки)
u Обеспечивает правильное сопоставление шаблонов в кодировке UTF-8

Шаблоны регулярных выражений

Скобки используются для поиска ряда символов:

Выражение Описание
[abc] Найдите один символ из вариантов в скобках
[^abc] Найдите любой символ НЕ в скобках
1 Найдите один символ из диапазона от 0 до 9

Метасимволы

Метасимволы Описание
| Найдите совпадение для любого из шаблонов, разделенных | как: cat|dog|fish
. Найдите только один экземпляр любого символа
^ Находит совпадение в начале строки, как в: ^Hello
$ Находит совпадение в конце строки, как в: World$
\d Находит цифру
\s Находит символ пробела
\b Находит совпадение в начале такого слова: \bWORD или в конце такого слова: WORD\b
\uxxxx Находит символ Юникода, указанный шестнадцатеричным числом xxxx

Квантификаторы (кванторы)

Квантификаторы определяют количества:

Квантификатор Описание
n+ Соответствует любой строке, содержащей хотя бы один n
n* Соответствует любой строке, содержащей ноль или более вхождений n
n? Соответствует любой строке, содержащей ноль или одно вхождение n
n

Соответствует любой строке, содержащей последовательность X n‘s
n

Соответствует любой строке, содержащей последовательность от X до Y n‘s
n

Соответствует любой строке, содержащей последовательность не менее X n‘s

Группировка

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

Пример

Используйте группировку для поиска слова «banana», ища ba за которым следуют два экземпляра na:

Полный справочник регулярных выражений

Справочник содержит описания и примеры всех функций регулярных выражений.

Источник

Регулярные выражения. Всё проще, чем кажется

Всем доброго времени суток. Сегодня хочу рассказать максимум о регулярных выражениях: что они из себя представляют, как их писать, для чего нужны и т.д.

Информации о регулярках много, они разбросаны по разным сайтам и я решил собрать всё, касательно регулярок, в одну статью. Ну что-ж, приступим поскорее к делу :)

Содержание

Что такое регулярка и с чем ее едят?

Где писать регулярки?

Самые простые регулярки

Специальные символы квантификаторов

Lookahead и lookbehind (опережающая и ретроспективная проверки)

Регулярные выражения в разных языках программирования

Что такое регулярка и с чем ее едят?

Если по простому, регулярка- это некий шаблон, по которому фильтруется текст. Мы можем написать нужный нам шаблон (регулярку) и таким образом искать в тексте необходимые нам символы, слова и т.д. Также их используют, например, при заполнении поля E-mail на различных сайтах, т.е. создают шаблон по типу: someEmail@gmail.com. Это я взял как пример, не более. Теперь, разобравшись, что это, приступим к изучению. Обещаю, скучно не будет)

Где писать регулярки?

Регулярки мы можем писать как на специальных сайтах, так и используя какой-либо язык программирования. Синтаксис (правила написания регулярок) не привязан к какому-то отдельному языку программирования. Поэтому, изучив регулярные выражения, вы сможете пользоваться ими где захотите. Сначала, в рамках изучения, воспользуемся отличным сайтом, а как писать регулярные выражения в различных языках программирования, рассмотрим чуточку позже.

Сразу дам ссылку на сайт, чтобы вы могли уже писать вместе со мной https://www.regextester.com/

Коротко о том, как пользоваться сайтом. Сверху, в графе Regular Expression вы пишете само регулярное выражение, а под ним, в графе Test String вы пишете строку, которую вы хотите фильтровать. Если были найдены соответствия между регулярным выражением и текстом, в тексте эти соответствия будут помечены синим цветом, вы их сразу увидите, даже не сомневайтесь.

Самые простые регулярки

Перед тем, как писать регулярку, возьмем некоторый текст, чтобы мы не фильтровали пустоту. Допустим, у нас будет строка some text. И допустим мы хотим найти слово text. Для этого в саму регулярку мы должны написать просто слово text и он найдет его.

image loaderПример регулярки

Вот и всё, надеюсь вы поняли регулярные выражения, спасибо за внимание.

Шутка конечно, это далеко не всё. Например, мы можем написать одну букву t, и он найдет все буквы t в тексте.

image loader

Таким образом вы можете просто указывать какие-то символы, но нам не всегда даются конкретные символы, а нужно написать какой-то шаблон. Сейчас этим и займемся.

Квантификаторы

Понимаю, звучит страшно, но на деле все просто. Сейчас разберемся.

С помощью квантификаторов мы можем указывать сколько раз должен повторяться тот или иной символ (ну или группа символов). Ниже приведу список квантификаторов с пояснением, а дальше попрактикуемся с ними.

— символ повторяется ровно n раз

— символ повторяется в диапазоне от m до n раз

— символ повторяется минимум m раз (от m и более)

image loader

Почему же он взял еще ssss? Он взял не совсем его, а лишь его часть, так как в нем тоже есть 3 буквы s подряд. Дело в том, что регулярка не будет учитывать, отдельное это слово или нет. Пробелы тоже идут как символы! Поэтому будет выбран любой фрагмент, которому соответствует 3 идущие подряд буквы s

image loader

Интересный момент получается, он выбрал все. Почему же? Ответ: та же ситуация, что и в прошлый раз. Он увидел ssss, взял 3 идущие подряд s вместе и еще одну s, которая рядом, ведь она тоже соответствует регулярку (а ведь мы помним, что мы указали диапазон от одного до трех раз)

Ну и напоследок, давайте напишем шаблон, где символ s будет повторяться минимум три раза. Для этого напишем следующее: s ( <3,>обозначает, что символ s будет повторяться от трех раз и до бесконечности).

image loader

Специальные символы квантификаторов

Есть уже готовые квантификаторы, которые обозначаются спец. символами. Вот они:

Давайте разбираться. Начнем со знака вопроса. Допустим у нас есть строка colour color и мы хотим найти либо colour, либо color. Мы можем написать так: colou?r.

image loader

Давайте изменим строку и напишем что-то по типу colouuuuur color. И допустим мы хотим указать, что u должен либо не быть, либо быть сколько угодно раз. Для этого мы можем написать colou*r.

image loader

То есть либо u у нас нет, либо повторяется много раз.

Символ + работает почти также, за исключением того, что символ должен повторяться минимум 1 раз. То есть в данном случае слово color не будет соответствовать, так как там u не присутствует (то есть повторяется 0 раз, а у нас символ должен повторяться минимум 1 раз)

image loader

Специальные символы

Теперь поговорим о специальных символах, которые используются в регулярках. Тут все очень просто, так что можете сильно не переживать. Скрины прикреплять буду здесь не везде (тогда статья разрастется до безумных размеров). Так что заранее прошу меня понять и простить и попробовать сами.

Поговорим об одиночном символе. Это значит, что будет выбираться любой символ, который повторяется только один раз. Например, вернемся к нашей строке Some text и выберем букву t, после которой идет любой символ. Для этого напишем t.

Выберется te, так как после t идет один любой символ (в данном случае е)

image loader

image loader

Теперь давайте возьмем слово test и выделим в нем первую букву t. Для этого мы можем написать ^t. То есть мы написали символ t и указали, что он должен находиться в самом начале строки. Важно поставить символ ^ перед нужным нам символом.

image loader

Теперь давайте сделаем наоборот и возьмем последнюю букву t. Для этого напишем t$. Важно, чтобы символ $ стоял после нужного нам символа.

image loader

Перейдем к экранированию. Звучит страшно, но на деле все проще простого. Например, в тексте some text. мы хотим выделить точку. Но ведь точка у нас уже зарезервирована как специальный символ (напоминаю, точка обозначает любой одиночный символ). И чтобы сделать так, чтобы точка на считалась как спец. символ мы можем написать \. и тем самым говоря, что точка у нас будет как обычный символ.

image loader

Теперь идут, простые вещи. \d у нас обозначает любую цифру. Например в тексте some text123, если написать \d у нас будут выделяться только цифры.

\D делает все наоборот: берутся все символы, кроме цифр. То есть, если написать \D будет браться все, кроме цифр (и пробелы, кстати, тоже).

\w берет буквы, а \W берет, все, кроме букв (в том числе и пробелы).

Теперь расскажу про еще одно применение символа ^. Его можно использовать как отрицание, тем самым исключая символ или группу символов. Например, в слове test мы хотим выбрать все, кроме буквы t и для этого мы можем написать так: [^t]

image loader

Именно в такой последовательности символ ^ будет обозначать отрицание.

Lookahead и lookbehind (опережающая и ретроспективная проверки)

Давайте разберемся, что это такое. Lookahead или же опережающая проверка позволяет выбрать символ или группу символов, если после него идет идет какой-либо символ или группа символов. Lookbehind или же ретроспективная проверка позволяет выбрать символ или группу символов, если до них идет какой-то символ или группа символов.

Также мы можем сделать наоборот и выбрать символ s, если после него НЕ идет символ d. Для этого вместо знака равно мы должны поставить восклицательный знак (!), т.е. написать вот так: s(?!d)

image loader

Теперь поговорим о lookbehind. Допустим, у нас есть строка s ws ds ts es и мы хотим выбрать символ s, до которого будет символ d. Для этого мы можем написать так: (? image loader

Почему же lookbehind подчеркивается красной линией? Дело в том, что lookbehind не всегда поддерживается и не везде такая регулярка будет работать. Нужно искать способ заменить этот lookbehind, но это зависит от поставленной задачи, поэтому нельзя сказать, как именно ее заменять. Будем надеяться, что в скором временем будет полная поддержка этой возможности.

Чтобы сделать наоборот, то есть выбрать все символы s, до которых НЕ будет идти символ d, нужно опять же поменять знак равно на восклицательный знак: (? image loader

Регулярные выражения в разных языках программирования

Здесь я приведу примеры использования регулярных выражений в различных языках программирования. Заранее говорю, я не буду заострять внимание на синтаксисе языка программирования, так как это уже не касается данной темы

Здесь мы создаем строку с текстом, который хотим проверить, создаем объект класса Regex и в конструктор пишем нашу регулярку (как я и говорил, я не буду заострять внимание на том, что такое объект класса и конструктор). Потом создаем объект класса MatchCollection и от объекта regex вызываем метод Matches и в параметры передаем нашу строку. В результате все сопоставления будут добавляться в коллекцию matches.

Java

Здесь похожая ситуация. Создаем объект класса Pattern и записываем нашу строку. CASE_INSENSITIVE означает, что он не привязан к регистру (то есть нет разницы между заглавными и строчными символами). Создаем объект класса Matcher и пишем туда регулярку.

JavaScript

Здесь тоже все просто. Вы создаете объект regex и пишете туда регулярку. И затем просто создаете объект matches, который будет являться коллекцией и вызываете метод exec и в параметры передаете строку.

Заключение

Итак, мы разобрали, что такое регулярные выражения, где они используются, как их писать и использовать в контексте языков программирования. Скажу сразу, написание регулярок приходит с опытом. Практикуйтесь, и я уверен: все у вас получится! А на этом я с вами прощаюсь. Спасибо за внимание и приятного всем дня)

Источник

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

Что такое регулярные выражения PHP?

Для чего используются регулярные выражения:

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

Теперь рассмотрим практические примеры использования упомянутых выше функций.

Preg match PHP

В приведенном ниже коде показан вариант реализации данного примера:

pregmatch 290831

Preg split PHP

Мы возьмем фразу и разобьем ее на массив; шаблон предназначен для поиска единичного пробела:

pregsplit 290831

Preg replace PHP

pregreplace 290830

Метасимволы

Метасимвол Описание Пример
. Обозначает любой единичный символ, кроме символа новой строки. /./ — все, что содержит один символ.
^ Обозначает начало строки, не включая символ /. /^PH/ — любая строка, которая начинается с PH.
$ Обозначает шаблон в конце строки. /com$/ — guru99.com,yahoo.com и т.д.
* Обозначает любое количество символов, ноль или больше. /com*/ — computer, communication и т.д.
+ Требуется вхождение перед метасимволом символа (ов) хотя бы один раз. /yah+oo/ — yahoo.
Символ экранирования. /yahoo+.com/ — воспринимает точку, как дословное значение.
[…] Класс символов. /[abc]/ — abc.
a-z Обозначает строчные буквы. /a-z/ — cool, happy и т.д.
A-Z Обозначает заглавные буквы. /A-Z/ — WHAT, HOW, WHY и т.д.
0-9 Обозначает любые цифры от 0 до 9. /0-4/ — 0,1,2,3,4.

Теперь рассмотрим сложный PHP regexp пример, в котором проверяется валидность адреса электронной почты:

Результат: адрес электронной почты name@company.com является валидным.

Пояснение шаблона «[/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+.[a-zA-Z.]<2,5>$/] «

validateemail 290830

Метасимволы являются полезными, когда речь идет о сопоставлении на соответствие шаблонам.

Заключение

Пожалуйста, оставьте ваши комментарии по текущей теме статьи. Мы очень благодарим вас за ваши комментарии, отклики, лайки, дизлайки, подписки!

Пожалуйста, оставляйте свои отзывы по текущей теме статьи. За комментарии, подписки, дизлайки, отклики, лайки низкий вам поклон!

Источник

Синтаксис регулярных выражений

Содержание

User Contributed Notes 15 notes

In the character class meta-character documentation above, the circumflex (^) is described:

«^ negate the class, but only if the first character»

It should be a little more verbose to fully express the meaning of ^:

^ Negate the character class. If used, this must be the first character of the class (e.g. «[^012]»).

ive never used regex expressions till now and had loads of difficulty trying to convert a [url]link here[/url] into an href for use with posting messages on a forum, heres what i manage to come up with:

at first it would collect ALL the tags into one link/bold/whatever, until i added the «?» i still dont fully understand it. but it works :)

For anyone who sees this error:

As this manual page says, you need PHP 5.1.0 and the /u modifier in order to enable these features, but that isn’t the only requirement! It is possible to install later versions of PHP (we have 5.1.4) while linking to an older PCRE install. A quick look at the PCRE changelog suggests that you probably need at least PCRE 5; we’re running 4.5, while the latest is 7.1. You can find out your PCRE version by checking phpinfo().

I suspect this ancient PCRE version is included in some officially-supported Red Hat Enterprise package which is probably why we are running it so might also affect other people.

For instance, if we have this string:

and apply this pattern:

About strip_selected_tags function from two posts below:

it does not work if somebody uses tags without ending «>» character, like this:

As a rule of thumb, it’s better to describe your regular expression patterns using single-quoted strings.

Using double-quoted strings, the interaction between PHP’s and PCRE’s interpretations of which bits of the string are escape sequences can get messy. Regular expressions can get messy enough as it is without another layer of escaping making it worse.

Pay attention that some pcre features such as once-only or recursive patterns are not implemented in php versions prior to 5.00

Hi there
This was originally made by someone eles but it didn’t work correctly and so I remade it and as far as I know it works right.

«)
You would get back
«this is

and this is bold»
Why? Because it did not take into account that there could be options etc in the HTML Tag.
My one works perfectly when stripping just the tags or the tag and its contents too!

So now when you run
strip_selected_tags(«this is

«)
You get back
«this is a test and this is bold»
Or when running
strip_selected_tags(«this is

«,true)
You get back
«this is and «

Источник

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

Что такое регулярное выражение?

Регулярные выражения в PHP (с англ. RegEx или regex) представляют собой последовательность символов, описывающих специальные шаблоны, которые применяются для различных вариантов обработки текста: проверки, поиска и замены того или иного фрагмента, состоящего из букв, цифр или любых других символов, в том числе специальных символов и символов пунктуации.

Синтаксис регулярных выражений

Регулярное выражение представляет собой строку, которая всегда начинается с символа разделителя, за ним следует шаблон регулярного выражения, затем еще один символ разделителя и, наконец, необязятельный список модификаторов.

Функции регулярных выражений

PHP предоставляет программистам множество полезных функций, позволяющих использовать регулярные выражения. Рассмотрим некоторые функции, которые являются одними из наиболее часто используемых:

Функция Определение
preg_match() Эта функция ищет конкретный образец в некоторой строке. Он возвращает 1 (true), если шаблон существует, и 0 (false) в противном случае.
preg_match_all() Эта функция ищет все вхождения шаблона в строке. Она возвращает количество найденных совпадений с шаблоном в строке, или 0 — если вхождений нет. Функция удобна для поиска и замены.
ereg_replace() Эта функция ищет определенный шаблон строки и возвращает новую строку, в которой совпадающие шаблоны были заменены другой строкой.
eregi_replace() Функция ведет себя как ereg_replace() при условии, что поиск шаблона не чувствителен к регистру.
preg_replace() Эта функция ведет себя как функция ereg_replace() при условии, что регулярные выражения могут использоваться как в шаблоне так и в строках замены.
preg_split() Функция ведет себя как функция PHP split(). Он разбивает строку на регулярные выражения в качестве параметров.
preg_grep() Эта функция ищет все элементы, которые соответствуют шаблону регулярного выражения, и возвращает выходной массив.
preg_quote() Эта функция принимает строку и кавычки перед каждым символом, который соответствует регулярному выражению.
ereg() Эта функция ищет строку, заданную шаблоном, и возвращает TRUE, если она найдена, иначе возвращает FALSE.
eregi() Эта функция ведет себя как функция ereg() при условии, что поиск не чувствителен к регистру.

Функция preg_match()

Функция preg_match() выполняет проверку на соответствие регулярному выражению.

Пример. Поиск подстроки «php» в строке без учета регистра:

Пример

Результат выполнения кода:

В примере выше символ «i» после закрывающего ограничителя шаблона означает регистронезависимый поиск, поэтому вхождение будет найдено.

Примечание: Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Для этого используйте strpos() или strstr(), т.к. они выполнят эту задачу гораздо быстрее.

Функция preg_match_all()

Функция preg_match_all() выполняет глобальный поиск шаблона в строке.

В примере регулярное выражение используется для подсчета числа вхождений «ain» в строку без учета регистра:

Пример

Результат выполнения кода:

Функция preg_replace()

Функция preg_replace() выполняет поиск и замену по регулярному выражению.

В следующем функция выполняет поиск в строке совпадений с шаблоном pattern и заменяет их на replacement:

Пример

Результат выполнения кода:

Модификаторы регулярных выражений

Модификаторы указываются либо в скобках, например так: (?Ui), либо после закрывающего символа ‘/pattern/Ui’.

Модификатор Описание
i Выполняет поиск без учета регистра. Например «/a/i» ищет и a, и A.
m Выполняет многострочный поиск (шаблоны, которые ищут начало или конец строки, будут соответствовать началу или концу каждой строки)
u Обеспечивает правильное сопоставление шаблонов в кодировке UTF-8 (для поиска русского текста например).
U Инвертирует «жадность» (по умолчанию жадный, т.е. пытается захватить как можно большую строку, подходящую по условию).
s Если используется, то символ точка (.) соответствует и переводу строки. Иначе она ему не соответствует.
x Игнорировать пробелы. В этом случае пробелы нужно экранировать обратным слэшем \.

При использовании модификаторов, можно использовать знак минус (-) для отключения модификатора. Например: (?m-i) — включаем многострочный поиск и отключаем регистронезависимый.

Шаблоны регулярных выражений

Квадратные скобки ([]) используются для нахождения ряда символов:

Выражение Описание
[abc] Один из символов a, b, c
[^abc] Любой символ кроме a, b, c
3 Любой символ из диапазона от 0 до 9
[a-zА-Я] Любой символ из диапазонов

Метасимволы

Преимуществом регулярных выражений является возможность использовать условия и повторения в шаблоне. Выражения записываются при помощи метасимволов, которые специальным образом интерпретируются. Метасимвол отличается от любого другого символа тем, что имеет специальное значение.

Одним из основных метасимволов является обратный слэш (\), который меняет тип символа, следующего за ним, на противоположный. Таким образом обычный символ можно превратить в метасимвол, а если это был метасимвол, то он теряет свое специальное значение и становится обычным символом. Этот приём нужен для того, чтобы вставлять в текст специальные символы как обычные. Например, символ d в обычном режиме не имеет никаких специальных значений, но \d — это уже метасимвол, который обозначает: «любая цифра». Символ точка (.) в обычном режиме значит — «любой единичный символ», а экранированная точка (\.) означает просто точку.

Метасимвол Описание пример
. Соответствует любому одиночному символу, кроме новой строки. /./ соответствует строке, состоящей из одного символа.
^ Соответствует началу строки. /^cars/ соответствует любой строке, которая начинается с cars.
$ Соответствует шаблону в конце строки. /com$/ соответствует строке, заканчивающейся на com, например gmail.com
* Соответствует 0 или более вхождений. /com*/ соответствует commute, computer, compromise и т.д.
+ Соответствующий предыдущему символу появляется как минимум один раз. Например, /z+oom/ соответствует zoom.
\ Используется для удаления метасимволов в регулярном выражении. /google\.com/ будет рассматривать точку как буквальное значение, а не как метасимвол.
a-z Соответствует строчным буквам. cars
A-Z Соответствует буквам в верхнем регистре. CARS
0-9 Соответствует любому числу от 0 до 9. /0-5/ соответствует 0, 1, 2, 3, 4, 5
[…] Соответствует классу символов. /[pqr]/ соответствует pqr
| Разделяет перечисление альтернативных вариантов. /(cat|dog|fish)/ соответствует cat или dog или fish
\d Любая цифра. /(\d)/ соответствует цифре
\s Найти пробельный символ (в т.ч. табуляция). /(\s)/ соответствует пробелу
\b Граница слова (начало или конец). /\bWORD/ найти совпадение в начале слова

Повторения (квантификаторы)

Комбинация типа \d\d означает, что цифра должна повторяться два раза. Но бывают задачи, когда повторений очень много или мы не знаем, сколько именно. В таких члучаях нужно использовать специальные метасимволы.

Повторения символов или комбинаций описываются с помощью квантификаторов (метасимволов, которые задают количественные отношения). Есть два типа квантификаторов: общие (задаются с помощью фигурных скобок <> ) и сокращенные (сокращения наиболее распространенных квантификаторов). Фигурные скобки x <1,7>задают число повторений предыдущего символа (в этом случае выражение ищет от 1 до 7 идущих подряд букв «x»).

Квантификатор Описанте
a+ Один и более раз a
a* Ноль и более раз a
a? Одна a или пусто
a

3 раза a
a

От 3 до 5 раз a
a

3 и более раз a

Группировка

Пример

Результат выполнения кода:

Выражение Описание
^[a-zA-Z0-9_]<1,>$ Любое слово, хотя бы одна буква, число или _
+@[a-z0-9A-Z] Соответствует строке с символом @ в начале, за которым следует любая буква нижнего регистра, число от 0 до 9 или буква верхнего регистра.
([wx])([yz]) wy, wz, xy, или xz
[a-z]+ Один или более символов нижнего регистра

Практические упражнения по регулярным выражениям PHP.

Источник

Понравилась статья? Поделить с друзьями: