Как захватить фрагменты контента с внешних веб-сайтов и отобразить их на моем веб-сайте? (Подобно тому, что делает RSS-канал или другой агрегатор).
Например, скажем, я хочу отображать элементы из календаря другого веб-сайта:
Другой сайт:
<h1>Here's our calendar:</h1> <div class="calendar_item"> <h2>Boston Marathon</h2> <p class="date">June 23, 2012</p> <p class="description">This marathon is 26.2 miles and lots of fun.</p> </div> <div class="calendar_item"> <h2>Irish Pub Crawl</h2> <p class="date">July 17, 2012</p> <p class="description">Shamrocks and green things are super-fun.</p> </div> <div class="calendar_item"> <h2>Tim's Birthday</h2> <p class="date">August 25, 2012</p> <p class="description">It's Tim's birthday, yo.</p> </div>
Мой веб-сайт:
<h1>Here's a feed of some calendar items from someone else's website:</h1> <div class="event_title">Boston Marathon</div> <div class="event_date">June 23, 2012</div> <div class="event_description">This marathon is 26.2 miles and lots of fun.</div> <div class="event_title">Irish Pub Crawl</div> <div class="event_date">July 17, 2012</div> <div class="event_description">Shamrocks and green things are super-fun.</div> <div class="event_title">Tim's Birthday</div> <div class="event_date">August 25, 2012</div> <div class="event_description">It's Tim's birthday, yo.</div>
Вот что я пробовал (используя MAMP):
<?php $url = "http://example.com"; $page = curl($url); $pattern = '% <h2>(.+?)</h2> %i'; preg_match($pattern,$page,$matches); print_r($matches); ?>
… который печатает:
Array ( )
Учебники / etc. Я рассматривал такие неоднозначные ответы, как «try cURL». Кажется, это так просто, но я тупой noob.
Спасибо заранее, ребята 🙂
Я бы не рекомендовал регулярное выражение для разбора HTML. PHP 5+ поставляется с парсером, который вы можете использовать, как показано ниже.
$content = file_get_contents('test.html'); $doc = <<<DOC $content DOC; $dom = new DOMDocument(); $dom->loadHTML($doc); $h2Tags = $dom->getElementsByTagName("h2"); $pTags = $dom->getElementsByTagName("p"); foreach($h2Tags as $h2 ) { //do something } foreach($pTags as $p ) { if($p->getAttribute("class") == "date") { //do something } }
$ h2 имеет тип DOMElement. Он наследует DOMNode. Таким образом, вы можете использовать свойство nodeValue для доступа к значениям. В приведенном выше примере вы можете написать $ h2-> nodeValue для доступа к контенту.
вы можете попробовать эту библиотеку http://simplehtmldom.sourceforge.net/
то просто:
foreach($dom->find('p[class=date]' as $p) { $date = $p->innertext; }
это даст вам
или вы делаете это более глобально и выкапываете с помощью stripos
foreach($dom->find('p') as $p) { if(stripos($p->class, 'date') !== false) { //do something } }
Вот пример использования cURL:
http://tr2.php.net/manual/en/curl.examples-basic.php
и проверьте, получаете ли вы данные перед применением preg_match
. Если вы их получите, то это проблема в регулярном выражении.