header

PHPでホームページのリンク先があるかどうか調べる

(1/2)

PHP では、ローカルディスクにあるファイルとインターネット上のコンテンツを同様に扱うことができる。 この特徴を利用して、ホームページ内に書かれているリンク先が存在しているかどうかチェックするプログラムを作ってみることにする。

0001: <?php
0002: /** check404.php
0003:  * ホームページのリンク先が存在するかどうか調べる
0004:  *
0005:  * @copyright   (c)studio pahoo
0006:  * @author      パパぱふぅ
0007:  * @version     1.0  2005/09/26
0008: */
0009: 
0010: /**
0011:  * パターンに一致するものがあるかどうかチェックする
0012:  * @param   String $pattern パターン(正規表現)
0013:  * @param   int    $n       パターンに一致する場所(正規表現内の順序)
0014:  * @param   String $str     チェック対象文字列
0015:  * @param   int    $ln      解析中の行番号
0016:  * @param   String $uri     解析中のURI
0017: */
0018: function check_link($pattern, $l, $str, $ln, $uri) {
0019:     $n = preg_match_all($pattern, $str, $arr);
0020: 
0021:     for ($i = 0; $i < $n; $i++) {
0022:         $target = $arr[$l][$i];
0023:         //相対アドレス指定の場合
0024:         if (preg_match("/^http:/", $target) == 0) {
0025:             $dirname = dirname($uri);
0026:             $target = $dirname . "/" . $target;
0027:         }
0028:         $cfp = @fopen($target, "r");
0029:         if ($cfp == FALSE) {
0030:             printf("<tr style=\"color:#FF0000\"><td align=\"right\">%d:</td><td>%s</td><td>なし</td></tr>\n", $ln, $target);
0031:         } else {
0032:             printf("<tr style=\"color:#0000FF\"><td align=\"right\">%d:</td><td>%s</td><td>あり</td></tr>\n", $ln, $target);
0033:         }
0034:     }
0035: }
0036: 
0037: /**
0038:  * リンク先の有無を表示する
0039:  * @param   String $uri      調査するURI
0040:  * @param   int    $flag_a   <a>タグのハイパーリンク先をチェックする
0041:  * @param   int    $flag_img <img>タグの画像ソースをチェックする
0042: */
0043: function check404($uri, $flag_a, $flag_img) {
0044:     $fp = fopen($uri, "r");
0045:     if ($fp == FALSE)   return FALSE;
0046: 
0047:     echo "<table border=\"0\">\n";
0048:     echo "<caption>$uri</caption>\n";
0049:     $ln = 1;
0050:     while (! feof($fp)) {
0051:         $s = fgets($fp);
0052:         if ($flag_a) {
0053:             $pattern = "/<a +href ?= ?\"?([\w-~_.:;=?&%#@\+\/]+)\"?/i";
0054:             check_link($pattern, 1, $s, $ln, $uri);
0055:         }
0056:         if ($flag_img) {
0057:             $pattern = "/<img +src ?= ?\"?([\w-~_.:;=?&%#@\+\/]+)\"?/i";
0058:             check_link($pattern, 1, $s, $ln, $uri);
0059:         }
0060:         $ln++;
0061:     }
0062:     fclose($fp);
0063:     echo "</table>\n";
0064: }
0065: 
0066: //初回起動時
0067: if ((isset($_POST["URI"]) == FALSE)) {
0068: $myself = basename($_SERVER["PHP_SELF"]);
0069: 
0070: // ここまでPHPプログラム =======================================================
0071: ?>
0072: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
0073:  "http://www.w3.org/TR/html4/loose.dtd">
0074: <html lang="ja">
0075: <head>
0076: <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
0077: <title>リンク先があるかどうか調べる</title>
0078: <body>
0079: 
0080: <h1>■リンク先があるかどうか調べる</h1>
0081: <form method="POST" action="<?= $myself ?>">
0082: URL:
0083: <input name="URI" type="text" size="100" />
0084: <input type="submit" value="チェック" />
0085: </form>
0086: 
0087: </body>
0088: </html>
0089: <?php
0090: // ここからPHPプログラム =======================================================
0091: } else {
0092: 
0093: check404($_POST["URI"], TRUE, TRUE);
0094: }
0095: // ここまでPHPプログラム =======================================================
0096: ?>
0097: 

Pほプログラムを実行する