Получать контент с URL-адреса, используя php

Я хочу получить динамическое содержимое с определенного URL:

Я использовал код

echo $content=file_get_contents('http://www.punoftheday.com/cgi-bin/arandompun.pl'); 

Я получаю следующие результаты:

 document.write('"Bakers have a great knead to make bread." ') document.write('© 1996-2007 Pun of the Day.com ') 

Как я могу получить струнные пекари, которые отлично месили бы хлеб. Только строка внутри первого document.write изменится, другой код останется постоянным

С Уважением,

Панкай

Вы извлекаете фрагмент кода JavaScript, который должен быть встроен непосредственно в документ, а не запрошен скриптом. Код внутри JavaScript.

Вы могли бы вытащить код, используя регулярное выражение, но я бы посоветовал это сделать. Во-первых, это, вероятно, не законно. Во-вторых, формат данных, которые они обслуживают, может меняться в любое время, нарушая ваш скрипт.

Я думаю, вы должны взять их в RSS-канал . Вы можете анализировать это программно проще, чем JavaScript.

Проверьте этот вопрос о том, как это сделать: лучший способ анализа RSS / Atom-каналов с помощью PHP

1) несколько локальных методов

 <?php echo readfile("http://example.com/"); //needs "Allow_url_include" enabled echo include("http://example.com/"); //needs "Allow_url_include" enabled echo file_get_contents("http://example.com/"); echo stream_get_contents(fopen('http://example.com/', "rb")); //you may use "r" instead of "rb" //needs "Allow_url_fopen" enabled ?> 

2) Лучший способ – CURL :

 echo get_remote_data('http://example.com'); // GET request echo get_remote_data('http://example.com', "var2=something&var3=blabla" ); // POST request //============= https://github.com/tazotodua/useful-php-scripts/ =========== function get_remote_data($url, $post_paramtrs=false) { $c = curl_init();curl_setopt($c, CURLOPT_URL, $url);curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); if($post_paramtrs){curl_setopt($c, CURLOPT_POST,TRUE); curl_setopt($c, CURLOPT_POSTFIELDS, "var1=bla&".$post_paramtrs );} curl_setopt($c, CURLOPT_SSL_VERIFYHOST,false);curl_setopt($c, CURLOPT_SSL_VERIFYPEER,false);curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:33.0) Gecko/20100101 Firefox/33.0"); curl_setopt($c, CURLOPT_COOKIE, 'CookieName1=Value;'); curl_setopt($c, CURLOPT_MAXREDIRS, 10); $follow_allowed= ( ini_get('open_basedir') || ini_get('safe_mode')) ? false:true; if ($follow_allowed){curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);}curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 9);curl_setopt($c, CURLOPT_REFERER, $url);curl_setopt($c, CURLOPT_TIMEOUT, 60);curl_setopt($c, CURLOPT_AUTOREFERER, true); curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate');$data=curl_exec($c);$status=curl_getinfo($c);curl_close($c);preg_match('/(http(|s)):\/\/(.*?)\/(.*\/|)/si', $status['url'],$link);$data=preg_replace('/(src|href|action)=(\'|\")((?!(http|https|javascript:|\/\/|\/)).*?)(\'|\")/si','$1=$2'.$link[0].'$3$4$5', $data);$data=preg_replace('/(src|href|action)=(\'|\")((?!(http|https|javascript:|\/\/)).*?)(\'|\")/si','$1=$2'.$link[1].'://'.$link[3].'$3$4$5', $data);if($status['http_code']==200) {return $data;} elseif($status['http_code']==301 || $status['http_code']==302) { if (!$follow_allowed){if(empty($redirURL)){if(!empty($status['redirect_url'])){$redirURL=$status['redirect_url'];}} if(empty($redirURL)){preg_match('/(Location:|URI:)(.*?)(\r|\n)/si', $data, $m);if (!empty($m[2])){ $redirURL=$m[2]; } } if(empty($redirURL)){preg_match('/href\=\"(.*?)\"(.*?)here\<\/a\>/si',$data,$m); if (!empty($m[1])){ $redirURL=$m[1]; } } if(!empty($redirURL)){$t=debug_backtrace(); return call_user_func( $t[0]["function"], trim($redirURL), $post_paramtrs);}}} return "ERRORCODE22 with $url!!<br/>Last status codes<b/>:".json_encode($status)."<br/><br/>Last data got<br/>:$data";} 

УВЕДОМЛЕНИЕ. Он автоматически обрабатывает проблему FOLLOWLOCATION + Удаленные URL-адреса автоматически корректируются! (src = "./ imageblabla.png" ——–> src = "http://example.com/path/imageblabla.png&quot😉

pson GNU / Linux, вам может потребоваться установить пакет php5-curl для его использования.

Ответ Пекки, вероятно, лучший способ сделать это. Но в любом случае это регулярное выражение, которое вы, возможно, захотите использовать, если вы обнаружите, что делаете что-то подобное, и не можете полагаться на каналы RSS и т. Д.

 document\.write\(' // start tag ([^)]*) // the data to match '\) // end tag 

EDIT, например:

 <?php $subject = "document.write('&quot;Paying for college is often a matter of in-tuition.&quot;<br />')\ndocument.write('<i>&copy; 1996-2007 <a target=\"_blank\" href=\"http://www.punoftheday.com\">Pun of the Day.com</a></i><br />')"; $pattern = "/document\.write\('([^)]*)'\)/"; preg_match($pattern, $subject, $matches); print_r($matches); ?>