Регулярные выражения. Парсинг на php
Перечитывая один из номеров журнала “Мой компьютер”, я наткнулся на одну полезную статейку, связанную с программированием на php. А конкретно речь шла о регулярных выражениях и парсингу ссылок с помощью них. Эти выражения позволяют легко находить в тексте не только участки по строгому совпадению с заданной строкой поиска, но и фрагменты, точный текст которых не известен, зато известна структура. Чтобы было понятнее – немного ниже приведу рассматриваемый пример ссылки.
Чтобы найти совпадение просто по определенному тексту в php, достаточно использовать функцию preg_match_all(), например в таком виде:
<?php preg_match_all(”/(1)(2)((3)4)5/”, “12345″, $m); ?>
<pre>
<?php print_r($m); ?>
</pre>
В данном случае функция выполняет сравнение первого выражение со вторым, и все имеющееся совпадения по тексту записывает в массив $m. Следовательно мы получим:
Array([0] => Array ([0] => 12345) [1] => Array ([0] => 1) [2] => Array ([0] => 2) [3] => Array ([0] => 34) [4] => Array ([0] => 3)).
Чтобы лучше понять эту систему можете поэкспериментировать с разным текстом. Ну а я иду дальше, собственно к использованию функции preg_match_all с регулярными выражениями, тоесть с совпадениями не по конкретному тексту а по его структуре.
Итак, теперь проводим операции с ссылкой (но запомните, здесь может быть любая строка, это не обязательно url) – http://www.rock-kingdom.com.ua/forum/kino/2651-gorod-boga.html. Чтобы найти совпадения этой строке не по символам, а по структуре текста – составляем регулярные выражения для отдельных групп символов. Итак:
- http:// – (http:\/\/)?
- www. – (www\.)?
- rock-kingdom.com.ua – ([\d\w\-]+(\.[\d\w\-]+)*)
- /forum/kino/2651-gorod-boga.html – ((\/([\d\w\-]+\/)+)([\d\w\.\-]+))?
Примечание: очень внимательно относитесь к каждому символу в регулярном выражении, не путайте разные слеши.
Из этого следует, что конечный результат будет таким:
- (http:\/\/)?(www\.)?([\d\w\-]+(\.[\d\w\-]+)*)((\/([\d\w\-]+\/)+)([\d\w\.\-]+))?
это и есть структура нашей ссылки в виде регулярного выражения.
Теперь можно написать небольшую программку на php, которая будет разделять ссылку на составные части. Делаем так:
<html>
<head>
<title>Пример</title>
</head>
<body> <?
if (isset ($_REQUEST["url"]))
{
//обрабатываем текст, введенный в поле ввода
$result=preg_match_all(’/(http:\/\/)?(www\.)?([\d\w\-]+(\.[\d\w\-]+)*)((\/([\d\w\-]+\/)+)([\d\w\.\-]+))?/’, $_REQUEST["url"], $m);
}
?>
<form id=”checkform” name=”checkform” action=”example.php” method=”post”>
<table width=”60%”>
<tr>
<td width=”10%”>
URL:
</td>
<td>
<input type=”text” id=”url” name=”url” size=”15″ style=”width:100%”
value=”<?php echo $_REQUEST["url"]; ?>”>
</td>
</tr>
<tr>
<td colspan=”2″ align=”center”>
<input type=”submit” value=”Разделить”>
</td>
</tr>
</table>
</form>
<?// если был введен текст
if (isset($_REQUEST["url"]))
{
?>
<br>
<?// если было совпадение с паттерном
if ($result)
{
//выдаем результат
?>
<table>
<tr>
<td><b>Полный URL:</b></td>
<td><?php echo $m[0][0]; ?></td>
</tr>
<tr>
<td><b>Протокол:</b></td>
<td><?php echo $m[1][0]; ?></td>
</tr>
<tr>
<td><b>Доменное имя</b></td>
<td><?php echo $m[3][0]; ?></td></tr>
<tr>
<td><b>Запрошенный ресурс:</td></b>
<td><?php echo $m[5][0]; ?></td></tr>
<tr>
<td><b>Путь к ресурсу:</td><b>
<td><?php echo $m[6][0]; ?></td></tr>
<tr>
<td><b>Имя ресурса:</td></b>
<td><?php echo $m[8][0]; ?></td>
</tr>
</table>
<?
}
else
{
//иначе сообщаем что был введен некорректный URL
?>
Введенный текст не является URL
<?
}
}
?>
</body>
</html>
Примечание: если будете копировать этот код и запускать на веб-сервере, замените все кавычки на новые, без этого действия скрипт может отрабатывать не корректно.
В итоге наш парсинг ссылок с помощью использования функции preg_match_all() и регулярных выражений должен выглядеть так:

Ну вот и все, теперь такой ход можно свободно применять в своих работах. Если у кого-то есть вопросы – пишите, с удовольствием помогу.
----------------------------------Понравилась статья? Подпишись на обновление блога через RSS или e-mail! 
Когда начинал заниматься изучением веб-технологий и интернета в целом, почти с первых дней мечтал о создании сайта не для кого-то, а для себя лично. В последнее время мне приходиться читать много блогов схожих с родом моей деятельности и идея создания своего он-лайн дневника стала все более навязчивой. 