Примеры решения задач

Задача

Задача. Дана строка 'aaa:444 kkk:333'. Напишите регулярку, которая найдет строки по шаблону: любое количество букв, символ ":", любое цифр и поменяет местами то, что стоит до ":" на то, что стоит после него. Например, aaa:444 должно превратиться в 444:aaa.

Решение: положим то, что стоит до символа ":" в первый карман, то, что стоит после ":" во второй карман, а затем в строке замены переставим местами содержимое первого кармана и второго, вот так - $2:$1:

<?php
	echo preg_replace('#([a-z]+):(\d+)#i', '$2:$1', 'aaa:444 kkk:333');
?>

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

444:aaa 333:kkk

Задача

Задача. Дана строка '332 441 550'. Найдите все места, где есть два одинаковых идущих подряд цифры и замените их на '!'.

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

<?php
	echo preg_replace('#(\d)\1#i', '!', '332 441 550');
?>

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

!2 !1 !0

Задачи для решения

На карманы при замене

Дана строка 'aaa@bbb eee7@kkk'. Напишите регулярку, которая найдет строки по шаблону: любое количество букв и цифр, символ @, любое количество букв и цифр и поменяет местами то, что стоит до @ на то, что стоит после нее. Например, aaa@bbb должно превратиться в bbb@aaa.

Решение:

<?php
	echo preg_replace('#([a-z0-9]+)@([a-z0-9]+)#', '$2@$1', 'aaa@bbb eee7@kkk');
 ?>

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

Решение:

<?php
	echo preg_replace('#\d#', '$0$0', 'a1b2c3');
 ?>

На карманы в самой регулярке

Дана строка 'aae xxz 33a'. Найдите все места, где есть два одинаковых идущих подряд символа и замените их на '!'.

Решение:

<?php
	echo preg_replace('#([a-z\d])\1#', '!', 'aae xxz 33a');
 ?>

Дана строка 'aaa bcd xxx efg'. Найдите строки, состоящие из одинаковых символов (это будет aaa xxx).

Решение:

<?php
	echo preg_replace('#([a-z])\1+#', '!', 'aaa bcd xxx efg');
?>

Задачи на preg_match[_all]

Задачи ниже не всегда можно решить с помощью одной только регулярки. Может понадобится еще что-нибудь дописать на PHP (не всегда, но такое может быть).

С помощью preg_match определите, что переданная строка является емэйлом. Примеры емэйлов для тестирования mymail@mail.ru, my.mail@mail.ru, my-mail@mail.ru, my_mail@mail.ru, mail@mail.com, mail@mail.by, mail@yandex.ru.

Решение:

<?php
	$str = 'mymail@mail.ru';
	echo preg_match('#^[a-z0-9_.-]+@[a-z_.-]+\.[a-z]{2,}$#', $str);
?>

Дана строка с текстом, в котором могут быть емейлы. С помощью preg_match_all найдите все емэйлы.

Решение:

<?php
	$str = 'mymail@mail.ru, my.mail@mail.ru, my-mail@mail.ru';
	preg_match_all('#[a-z0-9_.-]+@[a-z_.-]+\.[a-z]{2,}#', $str, $matches);
	var_dump($matches);
 ?>

С помощью preg_match определите, что переданная строка является доменом. Примеры доменов: site.ru, site.com, my-site123.com.

Решение:

<?php
	echo preg_match('#^[a-z0-9-]+\.[a-z]{2,}$#', 'my-site.com');
?>

С помощью preg_match определите, что переданная строка является доменом 3-го уровня. Примеры доменов: hello.site.ru, hello.site.com, hello.my-site.com.

Решение:

<?php
	echo preg_match('#^[a-z0-9-]+\.[a-z0-9-]+\.[a-z]{2,}$#', 'hello.my-site.com');
?>

С помощью preg_match определите, что переданная строка является доменом, название которого начинается с http. Примеры доменов: http://site.ru, http://site.com.

Решение:

<?php
	echo preg_match('#^http://[a-z0-9-]+\.[a-z]{2,}$#', 'http://site.com');
?>

С помощью preg_match определите, что переданная строка является доменом вида http://site.ru. Протокол может быть как http, так и https.

Решение:

<?php
	echo preg_match('#^https?://[a-z0-9-]+\.[a-z]{2,}$#', 'https://site.com');
?>

С помощью preg_match определите, что переданная строка является доменом. Протокол может быть как http, так и https. Домен может быть со слешем в конце: http://site.ru, http://site.ru/, https://site.ru, https://site.ru/.

Решение:

<?php
	echo preg_match('#^https?://[a-z0-9-]+\.[a-z]{2,}/?$#', 'https://site.com/');
?>

С помощью preg_match определите, что переданная строка начинается с http или с https.

Решение:

<?php
	echo preg_match('#^https?#', 'https://site.com/');
?>

С помощью preg_match определите, что переданная строка заканчивается расширением txt, html или php.

Решение:

<?php
	echo preg_match('#\.(txt|html|php)$#', 'index.html');
?>

С помощью preg_match определите, что переданная строка заканчивается расширением jpg или jpeg.

Решение:

<?php
	echo preg_match('#\.jpe?g$#', 'maket.jpeg');
?>

С помощью preg_match узнайте является ли строка числом, длиной до 12 цифр.

Решение:

<?php
	echo preg_match('#^\d{1,12}$#', '012345678910');
?>

Дана строка с буквами, пробелами и цифрами. Найдите сумму всех чисел из данной строки.

Решение:

<?php
	preg_match_all('#\d#', 'asf5asg 2asg sahh3', $matches);
	echo(array_sum($matches[0]));
 ?>

Задачи на preg_replace

С помощью preg_replace преобразуйте дату в формате '31-12-2014' в '2014.12.31'.

Решение:

<?php
	echo preg_replace('#(\d{2})\-(\d{2})\-(\d{4})#', '$3.$2.$1','31-12-2014');
?>

С помощью preg_replace замените в строке домены вида http://site.ru, http://site.com на <a href="http://site.ru">site.ru</a>.

Решение:

<?php
	$str = 'http://site.ru, http://site.com, https://site.info';
	echo preg_replace('#https?://([a-z0-9-]+\.[a-z]{2,})#', '<a href="$0">$1</a>', $str);
?>