Регулярные выражения. Парсинг на 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! 

“Теперь можно написать небольшую программку на php, которая будет разделять ссылку на составные части”
Я тоже когда-то потратил полтора часа на качественное разбиение ссылки… А потом нашел URL-функции, которые уже делают это сами…
Да, сейчас уже очень многие программные решения можно найти в готовом и автоматизированном виде. Но, еще есть куда развиваться
Аз будет рад что ресурс где он админит посещают сеошники))))
но если доработать написаный код то можно тырить с любого сайта контент в два клика. или наоборот добавлять на кучу сайтов одну статью.
Честно говоря смысл написания такой програмки от меня скрыт
Не знаю кто такой Аз
Вообще это их журнала пример, который действительно можно переделывать под себя и свои нужды.
Уважаемые господа! Я еще не очень опытный пользователь и много не знаю. Прошу помощи; подскажите как где и каким образом нужно добавлять код на блог-любой. Заранее благадарна. С уважением Надежда.
nadyazyk5527.blogger.ru, честно говоря не очень понял вопроса. На какой именно блог, что за код? Конкретнее пожалуйста.
А как сделать так.
К примеру найти все ссылки TEXT
Найти где ссылка example.com и вывести только TEXT (там может быть любой текст )
Это реально ?
Stas, реально. По сути нужно составить регулярное выражение, которое бы находило вот такие вот ссылки с точным вхождением текста и потом выводить анкор этой ссылки, который записан в теги .
А что archick полезная штука может пригодится. Надо где то сохранить.
Здрасте. Помогите написать рег. выр. У меня есть текст из 10 предложений.
Мне надо извлечь первые 3 предложений или например последние 5. Как это осуществить?
Можете посоветовать толковый учебник по регулярным выражениям?
Желательно с разнообразными примерами.
Благодарю.
”/(1)(2)((3)4)5/”, “12345″
-Неверны кавычки + 4 кавычка превращается в ″
@peter911
А примечание для кого писали?
qute:
Примечание: если будете копировать этот код и запускать на веб-сервере, замените все кавычки на новые, без этого действия скрипт может отрабатывать не корректно.