Примеры регулярных выражений в PHP

Здравствуйте, ребята! Этот пост постоянно обновляется. Со временем я вношу сюда новые регулярные выражения и стараюсь сначала проверить их на практике, а потом делюсь с вами. Если вы найдете полезным эти примеры, то не стесняйтесь об этом писать в комментариях. Также было бы здорово, если вы сможете оставлять свои примеры, чтобы и другие наши коллеги могли воспользоваться ими в своей работе. Буду рад, если вы поможете в этом другим. В конце статьи я советую вам обратить внимание на бесплатную плюшку. А сейчас перейдем к делу!

Содержание

  1. Как из строки получить подстроку, находящуюся внутри скобок?
  2. Как в строке заменить подстроку, находящуюся внутри скобок, захватив при этом окончание, стоящее сразу после закрывающей скобки?
  3. Как c помощью регулярного выражения PHP получить значение переменной из url?
  4. Как вырезать текст внутри тэга?
  5. Извлечение, вырезка тэга img из текста вместе с атрибутами
  6. Извлечение, вырезка aтрибута src тэга img из текста

Как из строки получить подстроку, находящуюся внутри скобок?

Например, имеем строку вида:

<?php

$phrase = '{preg_match} - выполняет подстановку регулярного выражения.'; 
preg_match("/{([^}]+)}*/i", $phrase, $found);
print_r($found); 

?>

Мы использовали функцию preg_match для решения данной задачи.
Получим следующий результат:

Array 
	)
		[0] => {preg_match} 
		[1] => preg_match 
	)

Наша подстрока находится во втором элементе массива $found. Кроме того, можно настроить регулярное выражение на работу, например, с разными видами скобок. Если нужно получить подстроку в квадратных скобках, изменим регулярное выражение следующим образом:

<?php

$phrase = '[preg_match] - выполняет подстановку регулярного выражения.'; 
preg_match("/[ # открывающая квадратная скобка
	   ([
	   ^] # взять с начала строки до скобки   
	   ]+)
	   ] # закрывающая квадратная скобка
	   */i", $phrase, $found);
print_r($found); 

?>

Мы изменили регулярное выражение в трёх местах. Получим тот же результат, что и в первом примере.

Как в строке заменить подстроку, находящуюся внутри скобок, захватив при этом окончание, стоящее сразу после закрывающей скобки?

Будем использовать функцию preg_replace для решения данной задачи.

<?php

$str = "Ищет в {sub}ject совпадения.";
$phrase = preg_replace('/{ # открывающая фигурная скобка
		(.*) 	 # взять любые символы внутри скобок 
		} 	 # закрывающая фигурная скобка
		([^s]*) # взять все символы после закрывающей 
		 	 # фигурной скобки кроме пробела
		/', '$1$2', $str); 
echo $phrase;

?>

Как видите, то, что нужно взять из фигурных скобок и вне их, выделено круглыми скобками. У нас есть два условия, первое в первых круглых скобках, второе — во вторых. Внутри функции, которая будет выполнять операцию со строкой
при помощи вышеприведенных условий, совпадение будет запоминаться в специальных переменных, поэтому к этим переменным можно обращаться через $1 и $2. Во втором аргументе функции preg_replace указаны эти две переменные. В результате мы получим:

Ищет в <em>subject</em> совпадения. 

Как c помощью регулярного выражения PHP получить значение переменной из url?

Используем функцию preg_match для решения данной задачи.

<?php

$url = 'http://www.softmaker.kz.php?cat=2&id=2'; 
// получим значение переменной $cat
preg_match("/
	?
	(?:.*&)*
	cat=
	([^&]+)
	/i", $url, $found);
echo $found[1];

// получим значение переменной $id
preg_match("/
	?
	(?:.*&)*
	id=
	([^&]+)
	/i", $url, $found);
echo $found[1];

?>


Значение переменной находится во втором элементе массива $found. Также для решения данной задачи можно использовать две функции php parse_url и parse_str.

<?php

$arr=parse_url('http://www.softmaker.kz.php?cat=2&id=101');
parse_str($arr['query'], $arr2);
print_r($arr2); 

?>

Получим следующий результат:

Array 
	)
		[cat] => 2 
		[id ] => 101 
	)

Как вырезать текст внутри тэга?

У нас есть текст внутри тэга:
<head>

текст с форматированием

</head>

Нужно получить:

текст с форматированием

Используем функцию preg_match:

<?php

$matches = null;
$firstStr = '<head>
		...
		текст с форматированием
		...
	     </head>';
$returnVal = preg_match('/<head>(.*)<\/head>/s', $firstStr, $matches);
print_r($matches);

?>

Получим результат:

Array 
	)
		[0] => '<head>
			  ...
			  текст с форматированием
			  ...
			</head>'
		[1] => '...
			текст с форматированием
			...' 
	)

Понятно, что мы можем заменить тэг head, например на тэг p, чтобы искать текст в нём.

Извлечение, вырезка тэга img из текста вместе с атрибутами

Используем функцию preg_match_all:

<?php

	// Вырезает из текста все теги img 
	//вместе со всеми атрибутами alt, title и т.д.
	$text = $myrow[text];
    preg_match_all('/<img[^>]+>/i', stripslashes($text), $matches);
    $bodytag = $matches[0];
	echo "<pre>";
    print_r($bodytag[0]);
    echo "</pre>";
	
?>

Получим результат:

Array
(
[0] => <img 
src="https://site.softmaker.kz/Forma-zadolzhennost-pered-postavshhikami-i-pokupatelyami.png" 
	width="508" height="354" 
	title="Внешний вид отчета 1С «Задолженность перед ...»"
	alt="Отчет 1С для конфигурации 1С Бухгалтерия 8.2. 
	«Задолженность перед поставщиками и покупателями»"/>
[1] => <img src="https://site.softmaker.kz/VyborPerioda-nastrojka-otchyota.png" 
	width="431" height="253" 
	title="Диалог «Настройка отчёта» для выбора значения периода"
	alt="Настройка отчета «Задолженность ..."/>
[2] => <img src="https://site.softmaker.kz/OtborKontragenta-nastrojka-otchyota.png" 
	width="557" height="231" 
	title="Диалог «Настройка отчёта» для выбора значения ..."
	alt="Настройка отчета «Задолженность ..."/>
[3] => <img 
	src="https://site.softmaker.kz/OtborGruppyKontragentov-nastrojka-otchyota.png" 
	width="512" height="231" 
	title="Диалог «Настройка отчёта» для выбора ..."
	alt="Настройка отчета «Задолженность перед поставщиками ..."/>
)

Извлечение, вырезка aтрибута src тэга img из текста

Используем функцию preg_match_all:

<?php

	$matches = null;
    // Вырезает из текста только src, т.е. только ссылку на изображение
    preg_match_all('/<img[^>]+src=([\'"])?((?(1).+?|[^\s>]+))(?(1)\1)/', 
	$myrow[text], $matches);
    echo "<pre>";
    print_r($matches[2]);
    echo "</pre>";

?>

Получим такой результат:

Array
(
    [0] => \"https://site.softmaker.kz/Forma-zadolzhennost-pered-postavshhikami-i-pokupatelyami.png\"
    [1] => \"https://site.softmaker.kz/VyborPerioda-nastrojka-otchyota.png\"
    [2] => \"https://site.softmaker.kz/OtborKontragenta-nastrojka-otchyota.png\"
    [3] => \"https://site.softmaker.kz/OtborGruppyKontragentov-nastrojka-otchyota.png\"
)