#1 RX pharmacy affiliate program!
Dec162008

Регулярные выражения. Парсинг на php

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!

Читайте по этой теме:

  1. Skullянваря 14, 2009
  2. archickянваря 15, 2009
  3. BOLVERINмая 16, 2009
  4. archickмая 17, 2009
  5. nadyazyk5527.blogger.ruиюня 22, 2009
  6. archickиюня 22, 2009
  7. Stasиюня 30, 2009
  8. archickиюня 30, 2009
  9. каменецавгуста 29, 2009
  10. Вася Пупкинсентября 6, 2009
  11. Igurokянваря 31, 2010
  12. peter911апреля 25, 2010
  13. Rena-ruмая 28, 2010

Оставьте комментарий