pagetaka

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

PHP:htmlのaタグから、リンクと文字を抜き出す

DOMでaタグを取得できたけど、絶対リンクで無かった

PHPを使って、サイトの更新情報などを得ようと妄想しています。これまでに、特定URLに表示された、HTMLから、たとえばaタグを取得する、というようなことがDOM経由でできました。ところがそれが相対リンクだったら、すぐには役立たない…。

ネット上に、正規表現を使った取得方法がありました

爺が考えるようなことは、大概すでにどなたかがネット上にあげてくれているです。ありがたいことです。

リンクのURLとリンク文字を別々に取り出すのに、今回、検索でヒットしたのは次の通りでした。

PHPで<a>タグ内からURLと文字を抜き出したい - PHP | 教えて!goo
なお、半角円マークがバックスラッシュで表示されているのかと。よろしくです。

<?
$html_tag = '<a href="http://www.hogehoge.com/hogehoge/hoge/sample.html" class="hogehoge" title="hogehoge">りんく先名称</a>';
preg_match("|<a href=\"(.*?)\".*?>(.*?)</a>|mis",$html_tag,$matches);
$url=$matches[1];
$text=$matches[2];
?>

上のスクリプトのうち、

preg_match("|<a href=\"(.*?)\".*?>(.*?)</a>|mis",$html_tag,$matches);

のところが正規表現のキモ部分です。

  • preg_match();
    • カッコの範囲内が正規表現の処理する手順、判断です。
  • |
    • これは選択肢ということだそうです。2か所ありますね
  • mis
    • mは単一行として処理。横長になりすぎ、適宜改行したり…あるなぁ…
    • iは大文字小文字を区別しない。確かに、URLを大文字で書いたりありますね~どのぞの会社のソフト
    • sは、「.」が改行を含まないとなっているのを、改行が含まれることを規定するパターン修飾子
  • $html_tagは、変数で、正規表現の調査対象となる文字列
  • $matchesは、正規表現の結果をほうり込む変数。ただし、あとの使い方[1]、[2]がついていると「配列」ということだけど、このスクリプト内では「配列宣言」してないし…はて?

正規表現を使い、対象に面倒な文字の並びがあっても、結果的に「href」につながる文字を見つけ、$matchesの配列[1]に格納してくれる、リンク文字はmatchesの配列[2]に格納してくれる、ということみたいです。

なので、「$url = $matches[1]」は、抽出したmatches[1]の値(URL)を左の$urlに代入(値を渡しなさい)というような意味になるのかと思うです。

この結果、上のphpの括りの下に、echo($url);とでもすると、分離・抽出(抜出)の結果となるリンク先アドレスが表示されるのだろう、と思います。
これを「foreach」などで循環させて対象となるaタグなどを順次引っ張り出すというか、抽出することができる…ように…なるはず…ですが…さて~。

相対リンクの場合は修正が必要

ところが、リンク先(=プロパティhrefの文字列≒URL)が、httpからはじまる絶対リンク表記ではなく、「./event/…」などのように、サイト内の相対リンク指定になっているのが多々あるわけで、困っておりました。aタグ取得できたのに、リンク先は見つからないというようなことになるのであります。
$urlに取り込んだリンク先ですが、相対指定されたリンク先だと「http://~」などがありませぬ。なので、適宜チェックして必要なら足してやるという作業が必要になりそうです。