1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
/** * ホームページの内容を取ってくる / Fetch the contents of the webpage * * https://davidwalsh.name/curl-download */ function getHtml($url) { $timeout = 5; $user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); $data = curl_exec($ch); curl_close($ch); // echo $data; return $data; } /** * html 文字列から タイトルとアーティクルを探して返す / Find and return title and article from html string */ private function getTitleAndArticleFromHtmlString($html) { // echo '<textarea>'.$html.'</textarea>'; $array = $this->parseHtmlToArray($html); list($k, $article) = $this->getValueByArrayKey('article', null, $array); // print_r($article); list($k, $title) = $this->getValueByArrayKey('h1', null, $article); // print_r($title); list($k, $body) = $this->getValueByArrayKey('div', array('key' => 'id', 'value' => 'entryBody'), $article); // print_r($body); return array('title' => strip_tags($this->arrayToHtml($title)), 'article' => $this->arrayToHtml($body)); } /** * html array から指定された tag, attribute を持つ配列を探して返す * * @param $searchKey: search target tag of html * @param $attribute null or array(key =>, value =>): search target attribute of html tag * @param $array: html array by simplexml_load_string */ private function getValueByArrayKey($searchKey, $attribute, $array) { foreach ($array as $key => $value) { if (preg_match('/^[0-9]+$/', $key)) { $key = 'div'; } if (strcmp($key, $searchKey) == 0) { if (is_array($attribute)) { if (is_array($value) && array_key_exists('@attributes', $value) && array_key_exists($attribute['key'], $value['@attributes']) && strcmp($value['@attributes'][$attribute['key']], $attribute['value']) == 0) { // echo ' key1: '.$key. 'a: '.$value['@attributes'][$attribute['key']]; return array(true, $value); } } else { // echo ' key2: '.$key; return array(true, $value); } } if (is_array($value)) { list($k, $v) = $this->getValueByArrayKey($searchKey, $attribute, $value); if ($k) { //echo ' key3: '.$key; return array(true, $v); } } } return array(false, null); } /** * html をパースして array に変換して返す / Parse html, convert it to an array and return */ private function parseHtmlToArray($html) { $domDocument = new DOMDocument(); @$domDocument->loadHTML($html); // エラー出力抑制 @ // Warning: DOMDocument::loadHTML(): Unexpected end tag : ... $xmlString = $domDocument->saveXML(); $xmlObject = simplexml_load_string($xmlString); // $xmlObject = simplexml_load_string($html); // var_dump($xmlObject); $array = json_decode(json_encode($xmlObject), true); // Object to Array return $array; } /** * simplexml_load_string でパースした html array を html 文字列に変換して返す / Convert html array to html string and return, the html array was parsed by simplexml_load_string and converted to array. * * 自己閉じタグには非対応 / Not supported for self closing tags. */ private function arrayToHtml($a) { $html = ''; foreach ($a as $key => $value) { if (strcmp($key, '@attributes') == 0) { continue; } else if (preg_match('/^[0-9]+$/', $key)) { $key = 'div'; } $html .= '<'.$key; if (is_array($value)) { if (array_key_exists('@attributes', $value)) { $attr = $this->attributeArrayToString($value['@attributes']); $html .= ' '.$attr.'>'; unset($value['@attributes']); } else { $html .= '>'; } $html .= $this->arrayToHtml($value); } else { $html .= '>'.$value; } $html .= '</'.$key.'>'; } return $html; } /** * simplexml_load_string でパースした html タグのアトリビュートの配列を文字列にして返す * * 値はダブルコーテーションで囲まれる */ private function attributeArrayToString($a) { $attr = ''; foreach ($a as $keyA => $valueA) { $attr .= ' '.$keyA.'="'.$valueA.'"'; } return $attr; } |