1
0

More than 3 years have passed since last update.

PHP <条件分岐でのincludeとURLからのタイトル取得>

Last updated at Posted at 2019-11-30

はじめに

最近はPHPについて学習しています。
ここ一ヶ月の勉強で学んだことを使用しながら、簡単なプログラムを作ってみました。
セキュリティ関係はほとんど考慮していません。ある程度のセキュリティについてはこちらの記事で説明しています。

作成した機能の説明

初期画面は以下の通り。
GETを使用したページ遷移を行いたい。また入力したURLからそのサイトの情報を一部取得したい(ここではtitleタグ取得する)。
スクリーンショット 2019-11-30 20.45.07.png
TopPage、MyPage、送信を押した場合の画面は以下の通り。
URLから取得したタイトルとそのURLをリンクとして表示する。またTopPageを押した場合はQiitaのトップページを、MyPageを押した場合は自分のMyPageを取得している。
スクリーンショット 2019-11-30 20.45.30.png

コード

先に上のプログラムのコードを載せておきます。

main.php
<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <h1>Qiitaのページ検索</h1>
<p>↓にincludeしたい</p>
<?php 
    if(!isset($_GET['title']) and !isset($_GET['pageid'])){
        include 'search.php';
    } else {
        include 'result.php';
    }
?>
<p>↑にincludeしたい</p>
 </body>
</html>
search.php
<form name = "form1" action = "main.php" method = "GET">

    <!-- TopPage -->
    <button type="submit" name="pageid" value=2>TopPage</button>
    <br/>

    <!-- MyPage -->
    <button type="submit" name="pageid" value=1>MyPage</button>
    <br/>

    <!-- 記事検索(入力チェックあり) -->
    <input type = "text" name ="title" pattern="^https://qiita.com{1}[a-zA-Z0-9!-/:-@¥[-`{-~]*$">
    <br/>
    <input id="send" value="送信" type="submit">
</form>
result.php
<?php

    // エラー確認用
    ini_set('display_errors', "On");
    ini_set('error_reporting', E_ALL);

    //タイトルを取得したいURL
    $url = '';

    // 表示するテキスト
    $text = '';
    $urlText = '';

    if(isset($_GET['title'])){
        //タイトルを取得したいURL
        $url = $_GET["title"];
    }

    if(isset($_GET['pageid'])){

        $pageid = $_GET['pageid'];

        // urlを設定
        switch ($pageid) {
            case 1:
                $url = 'https://qiita.com/vber_program';
                break;
            case 2:
                $url = 'https://qiita.com/';
                break;
        }  
    }

    if($url==''){
        echo "入力が空です<br>";
        return;
    }

    if(!preg_match("#^https://qiita.com+[a-zA-Z0-9!-/:-@¥[-`{-~]*$#",$url)){
        //urlがQiita以外のものは不正なページとして扱う
        echo "不正なページです。<br>";
        return;
    }

    //ソースの取得
    $source = @file_get_contents($url);

    //取得できたかどうかを判定
    if($source){
        //取得できたのでページは存在する
        //文字コードをUTF-8に変換し、正規表現でタイトルを抽出
        if (preg_match('/<title>(.*?)<\/title>/i', 
                        mb_convert_encoding($source, 'UTF-8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS'), 
                        $result)) {
            $urlText = $result[1];
            $urlText = str_replace("- Qiita", "", $urlText);

            //URL置換
            $pattern = '(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)';
            $replacement = '<a href="\1" target="_blank">\1</a>';
            $text = mb_ereg_replace($pattern, $replacement, htmlspecialchars($url));
        }
    }else{
        //取得できなかったのでページは存在しない
        $text = "ページは存在しません";
    }

    echo $urlText."<br>";
    echo $text."<br>";
?>

<a href="main.php" >前のページに戻る</a>

注意した点と簡単な解説

条件分岐によるinclude

[main.php]
純粋にIF文を使うだけでした。
GETで値を取得していなければ「検索画面のsearch.php」を表示し、GETに値が入っていれば「結果表示画面のresult.php」を表示させています。

正規表現チェック

[search.php , result.php]
入力画面とPHPの処理の両方に入れています。今回はQiitaのURL以外は弾くようにしています。
またtitleタグ内を取得する際にも使用しています。

file_get_contents

[result.php]
入力したURLのソースを取得しています。失敗した場合にはFalseを返すのでIF文で判断します。

preg_match

[result.php]
正規表現を使用して「file_get_contents」で取得したソースの中からtitleタグ内の情報を検索しています。

mb_ereg_replace

[result.php]
正規表現を使用した文字置換。入力した値をURLに変換する際に使用しました。
また「htmlspecialchars」を使用して特殊文字をHTMLエンティティに変換しています。

return

[result.php]
exitを使用して処理を抜けてしまうと、それ以降の処理(今回の場合は「↑にincludeしたい」を表示する部分)が中断されてしまいます。そのためreturnを使用して処理を抜けるようにしました。

おわりに

今回使用した関数でわかりにくい部分があれば、公式サイトで調べてみて下さい。
多分もっといい書き方があるはず……。

参考にさせて頂いたサイト様

PHP公式サイト

PHPで指定したURLのタイトルタグの中身を取得する方法

基本的な正規表現の使い方

マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~

PHPのincludeでGETのパラメーター(引数)の渡し方

ありがとうございました!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0