От автора: не люблю каждый раз натыкаться на одни и те же грабли! Вот сегодня опять та тема, в которой никак не обойтись без регулярных выражений. Это и есть мои любимые «грабли». Но все равно я не сдамся, и чтобы с помощью PHP находить ссылки, я обойдусь без них!
Никуда без них не деться!
Нет уж, господа консерваторы! Я постараюсь уж как-нибудь реализовать парсинг документов без этого застарелого средства. Ну не хватает у меня терпения на составление шаблонов с помощью регулярных выражений. А когда терпение лопается, то рождаются другие более «ругательные» выражения :). Так что «грабли» в сторону – мы идем по собственному галсу!
Чтобы не опростоволоситься, нам потребуется сторонняя библиотека — Simple HTML DOM. Скачать ее можно по этой ссылке. Не беспокойтесь, версия хоть и старая, но работает. А главное, что это средство посвежее будет, чем выражения регулярные :).
После распаковки помещаем файл simple_html_dom.php в папку со скриптом, чтоб легче было подключать. Все остальные файлы в принципе нас не интересуют, но пригодятся вам в будущем. Там есть и мануал, и примеры использования библиотеки.
Реализуем!
Напомню, что сегодня мы научимся, как найти ссылки PHP без «ужасных» регулярных выражений. Теперь нам осталось подключить скрипт библиотеки у себя в коде и просканировать указанную веб-страницу на наличие гиперссылок.
1 2 3 4 5 6 |
<?php include 'simple_html_dom.php'; $razmetka = file_get_html('//test2.ru/'); foreach($razmetka->find('a') as $teg) echo $teg->href . "<br>"; ?> |
Для доказательства действенности этого метода приведу код разметки «отпарсеной» страницы.
Сразу оговорюсь, что я не сканировал ничей сайт. Для демонстрации примера я использовал Денвер, а в нем стоит программная заглушка, которая не позволяет парсить удаленные хосты.
Еще пример!
Вот еще один вариант реализации, в котором нам также удастся обойтись без «граблей».
1 2 3 4 5 6 7 8 9 10 11 |
<?php $razmetka_html = file_get_contents('sample.html'); $dom = new DOMDocument; $dom->loadHTML($razmetka_html); $tegi = $dom->getElementsByTagName("a"); foreach ($tegi as $teg) { echo $teg->nodeValue." "; echo $teg->getAttribute('href')."<br>"; echo "<br>"; } ?> |
Разметка страницы, в которой с помощью PHP находили ссылки в тексте.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<html> <head> <title>Sample</title> </head> <body> <div class="menu"> <h2>Menu</h2> <ul> <li><a href="1.php">Linc 1</a></li> <li><a href="2.php">Linc 2</a></li> <li><a href="3.php">Linc 3</a></li> <li><a href="4.php">Linc 4</a></li> <li><a href="5.php">Linc 5</a></li> </ul> </div> <div class="cont"> <p>PHP is a server scripting language</p> </div> </body> </html> |
Мне очередной раз удалось избавиться от своих «граблей» :). А вам?