Как отображать контент, захваченный с внешних сайтов?

Как захватить фрагменты контента с внешних веб-сайтов и отобразить их на моем веб-сайте? (Подобно тому, что делает 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 . Если вы их получите, то это проблема в регулярном выражении.