人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【phpプログラム】htmlファイルのソースから、リンク先の文字列を抜き出すプログラムを書きたいのですが、参考になるサンプルを書いて頂けませんか。

例えば
【サンプルソース】
<html><head></head><body>
<a href="./test/index.html">リンク先1</a>
<a href="../test/index2.html">リンク先2</a>
<a href="/test.index3.html">リンク先3</a>
</bod>
</html>

【結果】
連想配列で、以下のように取得できたらいいのですが。
[0] "./test/index.html" => "リンク先1"
[1] "../test/index2.html" => "リンク先2"
[2] "/test.index3.html" => "リンク先3"

宜しくお願いします。

●質問者: sakata0819
●カテゴリ:インターネット ウェブ制作
✍キーワード:HTML INDEX PHP test サンプルソース
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● あぱ
●60ポイント

こちらを参考にこんな感じでいかがでしょうか?

phpの正規表現で躓いています。 アンカータグのリンク先を取得したいのですが、 $str ="<a href=\"http://www.hogehoge.hoge\">あかさんた</a>"; $pattern = "<a href=\"(... - 人力検索はてな

$strList = array();

$strList[] = '<html><head></head><body>';
$strList[] = '<a href="./test/index.html">リンク先1</a>';
$strList[] = '<a href="../test/index2.html">リンク先2</a>';
$strList[] = '<a href="/test.index3.html">リンク先3</a>';
$strList[] = '</bod>';
$strList[] = '</html>';

$result = array();

$pattern = '<a href="(.*)">(.*)<\/a>.*$' ;

foreach ($strList as $str)
{
preg_match ( "/".$pattern."/i", $str, $matches );
//print_r($matches) . "\n";

if (count($matches) == 3)
{
$result[] = $matches[1] . " => " . $matches[2];
}
}

foreach ($result as $ret)
{
echo $ret . "\n";
}

ただ、この方法だと、同じ行に2箇所アンカータグがあると、誤動作してしまいます。

今のところこれが限界です。

申し訳ありません。

◎質問者からの返答

ありがとうございました、参考になりました。


2 ● pahoo
●80ポイント

以下にソースを示します。

抽出したいリンク文字列のパターンは $RegPat に定義しておきます。いまは、a タグで、拡張子が html|htm|shtm|shtml のものを抽出できるようにしてあります。同じ行に複数のタグがあっても処理できます。

なお、文字コードは処理系の設定に依存しています。


さらに、相対URLを絶対URLに正規化する処理を含め、我が家のホームページ「正規表現で画像ファイルのURLを取り出す」で紹介しています。参考にしてください。

<?php
$RegPat = "/\<a(.*)href=\"?([\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+\$\,\%\#]+(html|htm|shtm|shtml))/i";

function get_url($str, &$urls) {
 global $RegPat;
 //マッチするすべての部分文字列を取り出す
 if (($n = preg_match_all($RegPat, $str, $arr, PREG_SET_ORDER)) == FALSE)
 return FALSE;
 //1次元配列にコピーする
 foreach ($arr as $key=>$val) $urls[$key] = $arr[$key][2];
 return $n;
}

//メイン処理
$str = file_get_contents(★ソースファイル名);
$arr = array();
get_url($str, $arr);

print_r($arr);
?>
◎質問者からの返答

ありがとうございました、とても参考になりました。


3 ● y-kawaz
●100ポイント ベストアンサー

そんなに大した話でもなく正規表現で一発かと。

<?php
$html = '<html><head></head><body>
<a href="./test/index.html">リン<span>ク</span>先1</a>
<a href="../test/index2.html">リンク先2</a><a href="/test.index3.html">リンク先3</a>
</bod>
</html>';

function get_link_texts($html) {
 if(preg_match_all('/<a(?:\s[^>]*)?>(.*?)(?=<\/a\s*>)/i', $html, $m)) {
 return array_map("strip_tags", $m[1]);
 }
}

print_r(get_link_texts($html));
?>

strip_tagsはaタグ内のタグを除いたテキストのみが欲しいんじゃないかと思ったので足しておきました。

◎質問者からの返答

ありがとうございました、最も参考になりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ