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:
| 2005年09月30日更新 | ||
| <<前へ | <目次> | 次へ>> |
| 戻る | 【関連ページ】 | |