dポイントプレゼントキャンペーン実施中!

被リンクの一覧を抜き出す正規表現が分かりません。

特定のページにアクセスして、そのページに含まれる被リンクの一覧を表示するphpを作成しています。
例えば、以下の「なんとか1」や「なんとか2」を抜き出したいです。
<a href=http://c.oshiete/>なんとか1</a>
<a href=http://goo.com/>なんとか2</a>

<?php
$fname=htmlspecialchars($_POST['word']);
$file1=@fopen($fname,'r') or exit('アクセスが出来ませんでした。');
$data='';
while(feof($file1)==false){
$data.=fgets($file1);
}
fclose($file1);
preg_match_all('?ここが分かりません。',$data,$result);
if(count($result[0]==0)) exit('URLは含まれていません');
echo ('<table border=1>');
echo ('<tr><th>'.$fname.'に含まれるURL</th></tr>');
foreach($result[0] as $obj){
echo '<tr><td>'.htmlspecialchars($obj).'</td></tr>';
}
echo '</table>';
?>

宜しくお願い致します。

A 回答 (2件)

説明を入れておけばよかったですね。



preg_match_allでは正規表現に()を入れておくとそこに該当する部分も一緒に取得できます。
"/<a .*?>(.*?)<\/a>/i"ですので何とかにあたるのは(.*?)の部分です。
$result[0]に正規表現全体に該当する部分(ここでは<a href=...>なんとか</a>)が
$relust[1]に(.*?)にあたる部分が抜き出されます。
ですので欲しい部分はすでに取り出されております。
その後の
foreach($result[1] as $obj){
echo '<tr><td>'.htmlspecialchars($obj).'</td></tr>';
}
で、$result[1]をforeachでまわしているので被リンクが出力されているわけです。
ちなみに()の数を増やすとその分だけ$resultにセットされます。
例)
<a href=http://c.oshiete/>なんとか1</a>
<a href=http://goo.com/>なんとか2</a>
に対して$match="/<a href=(.*?)/>(.*?)(<\/a>)/i"という感じでマッチングすると
$result[0][0]=<a href=http://c.oshiete/>なんとか1</a>
$result[0][1]=<a href=http://goo.com/>なんとか2</a>
$result[1][0]=http://c.oshiete
$result[1][1]=http://goo.com
$result[2][0]=なんとか1
$result[2][1]=なんとか2
$result[3][0]=</a>
$result[3][1]=</a>
となります。
    • good
    • 0
この回答へのお礼

お返事を頂きありがとうございます。
なんとか1やなんとか2のみを、無事取り出すことができました。

duronさん、ありがとうございました。

お礼日時:2010/07/02 12:42

タグの閉じ忘れ等を考慮しないのでよければ↓のような感じで



<?php
// $fname=htmlspecialchars($_POST['word']);
$fname=htmlspecialchars("http://www.yahoo.co.jp/");
$file1=@fopen($fname,'r') or exit('アクセスが出来ませんでした。');
$data='';
while(feof($file1)==false){
$data.=fgets($file1);
}

$match="/<a .*?>(.*?)<\/a>/i";
preg_match_all($match,$data,$result);
if(count($result[0])==0) exit('URLは含まれていません');
echo ('<table border=1>');
echo ('<tr><th>'.$fname.'に含まれるURL</th></tr>');
foreach($result[1] as $obj){
echo '<tr><td>'.htmlspecialchars($obj).'</td></tr>';
}
echo '</table>';
?>
    • good
    • 0
この回答へのお礼

お返事を頂きありがとうございます。
無事に被リンクのみが表示できました。

できたら、「なんとか1」や「なんとか2」のみを取り出したいのですが、
正規表現では難しいでしょうか?

取り出したあとに、replaceを使って<a>タグを消去する方法に
なるのでしょうか??

foreach($result[0] as $obj){
$obj2=preg_replace('/<a.*?>/i','',$obj);
$obj3=preg_replace('/<\/a>/','',$obj2);
echo '<tr><td>'.htmlspecialchars($obj3).'</td></tr>';
}

できましたら、こちらにもご回答を頂けると助かります。
宜しくお願い致します。m(_ _)m

お礼日時:2010/06/30 20:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!