pagetaka

写真、PC、ネット、岡山、旅の話題をお届けします

PHP:DOMするHTMLタグを限定する。

aタグはいっぱいある

インターネットの特性というか、リンクは命であります。それを表すHTMLタグは「a」です。
ひとつ前の記事で「find('a')」と書いて「a」タグ周りの情報を拾いだしたんですが、実際に必要なのはそのうちのいくつか…。どう限定するか…。

親要素のHTMLタグと組みあわせ、必要なaタグを絞り込む

まずHTMLの基礎知識です。
f:id:PageTAKA:20150702103812j:plain
基本、閉じタグとともに使われる。ここでつまずいたらかなりヤバイです。復習を~

構造化されたHTML文書を分析する、というのがDOMを通じてやりたいことです。
「構造化」とか「h要素」「id属性」などがわからん、という方もヤバイです。

時々このブログに書いてますが、大きい文字だから「見出し」ではなく「h」タグがついているのでなんらかの「見出し」、というご理解を。それが、サイト内を通してキッチリと同じ意味で使われている、ということが大切です。1本の記事の主見出しをつけるさい、気分で「h1」をつかったり「h2」を使ったりせず、同じのを使うことが大切です。
また、「id属性」で用いる同名の「属性値」は1頁に1回登場するのみ、というルールを知っていることがポイントかと…。
あわせて、少しばかりのCSS知識も…。HTMLで表す「id」は「#」となり、「class」は「.」となる…。

そして、いよいよ、親要素をつかった絞り込みです。
例示は、このブログの記事の見出し部分です。

<h1 class="entry-title">
<a href="http://pagetaka.hatenablog.com/entry/2015/07/02/PHP%3ADOM%E5%AE%9F%E8%A1%8C%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%82%E3%83%91%E3%82%B9%E3%82%92%E9%80%9A%E3%81%97%E5%BF%98%E3%82%8C%E7%84%A6%E3%82%8B" class="entry-title-link bookmark">PHP:DOM実行エラー。パスを通し忘れ焦る</a>
</h1>

「h1」には「entry-title」というクラスが属性としてついています。その中に、個別記事をさすリンクが「a」タグの属性値としてあります。
「h1 class="entry-title"」が親というか上位にあります。「a href="x.jp "」が目標

「h1.entry-title a」とすると、記事見出しの「a」タグ関連の内容(属性値=リンクと、要素の内容=リンク先名称、が表示されます。ここで「class」を「.」で代用したことになります。これは、CSSの知識があれば容易に想像できます。(今回は、「.entry-title」部分は意味ありませんが…必要なときもあるということでご理解を)。

aタグのリンク先URL(属性値)のみ抜き出す。正規表現

ひとつ前の記事「PHP:DOM実行エラー。パスを通し忘れ焦る - PageTAKA's blog」にあるphpスクリプトで画面表示を「echo」で行っている次、変数「$ele」(名前は適宜)には「a」タグの全体が入っています。

「$ele」を分解し具体的なURLを取り出すには、その属性名「href」の値(URL)を抽出する作業をおこないます。

「find('a')」のところを「find('h1.entrytitle a')」に書き換えて実行したら、リンク付きの記事見出し…。さてURLだけの抽出…。

これは「正規表現」を使ってやるです。

リンク先URLとリンク先名をaタグから分離する:正規表現

ひとつ前の記事で、$eleに必要なHTMLがはいっている、という前提ですすめるです。

preg_match("|<a href=\"(.*?)\".*?>(.*?)</a>|mis",$ele,$parts);
	$url = $parts[1];
	$text = $parts[2];
	echo $text."<br />".$url."<br /><br />"

ひとつ前の記事のPHPスクリプトのechoがある行を、上の4行に置き換えると、動く(はず…)です。

PHP:DOM実行エラー。パスを通し忘れ焦る
http://pagetaka.hatenablog.com/entry/2015/07/02/PHP%3ADOM%E5%AE%9F%E8%A1%8C%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%82%E3%83%91%E3%82%B9%E3%82%92%E9%80%9A%E3%81%97%E5%BF%98%E3%82%8C%E7%84%A6%E3%82%8B

「日刊ゲンダイ」デジタル版、月間PV9000万。長めの見出し
http://pagetaka.hatenablog.com/entry/2015/07/02/%E3%80%8C%E6%97%A5%E5%88%8A%E3%82%B2%E3%83%B3%E3%83%80%E3%82%A4%E3%80%8D%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%89%88%E3%80%81%E6%9C%88%E9%96%93PV9000%E4%B8%87%E3%80%82%E9%95%B7%E3%82%81%E3%81%AE

散歩:今朝はオトシモノ処理
http://pagetaka.hatenablog.com/entry/2015/07/02/%E6%95%A3%E6%AD%A9%EF%BC%9A%E4%BB%8A%E6%9C%9D%E3%81%AF%E3%82%AA%E3%83%88%E3%82%B7%E3%83%A2%E3%83%8E%E5%87%A6%E7%90%86

爺がやってみたら上のようになったです。

「正規表現」のキモ部分、
preg_match("|<a href=\"(.*?)\".*?>(.*?)</a>|mis"

のところは、あまり考えず、そのまま覚えた方がよさそうかと…。