PHP 正規表現を使い検索機能を改善する方法。

今回はユーザーが検索用のテキストボックスに入力した「予想外の空白」を取り除き、SQL文を作成するためのキーワードを取り出す機能を search.php に組み込みます。

前回 test.php で機能はテスト済みですから、変更は1行だけです。 PHP は他のプログラミング言語と同様に正規表現が使えるので、複雑な処理も簡単に書くことができます。

同様な処理をプログラムで書くと結構長いソースコードになりますが、正規表現ならたった1行です。


【1】前回コピーした sample109 フォルダをそのまま使います。

php-268.gif


【2】今回は search.php の1行を変更するだけです。

php-266.gif

・他のファイルは sample108 と同じものなので、ソースコードは省略します。

*「\」はWindowsではエンマークのことです。

保存先 C:\phpdev\www\test\sample109
ファイル名 search.php

<?php
  //ファイルを読み込み
  require_once("SampleDB050.php");

  //データを取得する
  $searchSelect = $_POST['searchSelect'];
  $keyword = $_POST['keyword'];
  $keyword = ereg_replace("[  ]+", " ", $keyword);
  $keyword = trim($keyword);
  

  //検索キーワード未入力時
  if(empty($keyword)){
    print "<html>";
    print "<head><title>未入力</title></head>";
    print "<body>";
    print "検索キーワードが入力されていません。";
    print "<p><a href=\"select.php\" target=\"_self\">全件表示へ</a><p>";
    print "</body>";
    print "</html>";
    exit;
  }

  //抽出条件を組み立てる
  $array = explode(" ", $keyword);
  $cnt = count($array);
  $where = "WHERE ";

  for($i=0; $i < $cnt; $i++){
    $where.= "PREF_NAME LIKE '%".$array[$i]."%'";
    if($i < $cnt-1){
      $where .=" ".$searchSelect." ";
    }
  }

  // クエリを送信する
  $sql = "SELECT * FROM T01Prefecture ".$where;
  $sql .= " ORDER BY PREF_CD";
  $result = executeQuery($sql);
  print $sql;
  //結果セットの行数を取得する
  $rows = mysql_num_rows($result);

  //表示するデータを作成
  if($rows){
    while($row = mysql_fetch_array($result)) {
      $tempHtml .= "<tr>";
      $tempHtml .= "<td>".$row["PREF_CD"]."</td><td>".$row["PREF_NAME"]."</td>";
      $tempHtml .= "<td><a href=\"update.php?cd=".$row["PREF_CD"]."\" target=\"_self\">更新</a></td>";
      $tempHtml .= "<td><a href=\"delete.php?cd=".$row["PREF_CD"]."\" target=\"_self\">削除</a></td>";
      $tempHtml .= "</tr>\n";
    }
    $msg = $rows."件のデータがあります。";
  }else{
    $msg = "データがありません。";
  }

  //結果保持用メモリを開放する
  mysql_free_result($result);

?>

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
    <title>検索結果</title>
    <script type="text/javascript" src="select.js"></script>
  </head>
  <body>
    <h3>検索結果</h3>

    <form name="form2" action="search.php" method="post">
      <input type="text" name="keyword" size="25" value="<?= $keyword ?>">
      <input type="submit" name="search" value="検索"><br />
      <input type="radio" checked name="searchSelect" value="AND">AND 
      <input type="radio" <?= ($searchSelect == "OR")? "checked" : "" ?> name="searchSelect" value="OR">OR
    </form>

    <?= $msg ?>
    <table width = "300" border = "1">
      <tr bgcolor="##ccffcc"><td>PREF_CD</td><td>PREF_NAME</td><td colspan="2">EDIT</td></tr>
      <?= $tempHtml ?>
      <form name="form1" action="insert.php" method="post">
        <tr>
          <td><input type="text" name="cd" id="cd"></td>
          <td><input type="text" name="name"></td>
          <td colspan="2">
            <input type="submit" name="insert" value="追加"><input type="reset" value="リセット">
          </td>
        </tr>
      </form>
    </table>
    <p><a href="select.php" target="_self">全件表示へ</a><p>
  </body>
</html>



【3】C:\phpdev にある 2K-NT-XP-phpdev_start.bat をダブルクリックして、phpdev を起動します。

php-02.gif

準備ができたら作成したPHPプログラムを実行してみましょう。


【4】ブラウザのアドレスに http://localhost/test/sample109/select.php と入力し、実行します。


【5】全件表示(select.php)の画面が表示されました。

php-261.gif


【6】まずは普通に操作します。キーワードをスペースで区切り「山 岡」と入力し、「OR」を選択して「検索」ボタンをクリックします。

php-262.gif


【7】検索結果(search.php)の画面が表示されました。「山」または「 岡」を含む都道府県の一覧が表示されています。

php-263.gif

SQL文を見ると抽出条件が OR でつながっています。ORはどちらか一つのキーワードが含まれていれば表示されます。


【8】次はわざと間違った操作をします。キーワードをスペースで区切り「  山      岡   」と入力し、「OR」を選択して「検索」ボタンをクリックします。

php-264.gif

*スペースは半角と全角を混ぜて、複数続けて入力してください。


【9】検索結果(search.php)の画面が表示されました。「山」または「 岡」を含む都道府県の一覧が正常に表示されています。

php-265.gif

*テキストボックスのキーワードも正しく修正されています。


【10】複数の空白を含めて「AND」で検索したときも、正常に表示されることを確認してください。

php-267.gif


【11】検索するキーワードや空白など、条件をいろいろ変えて動作を確認してください。


【解説】

■select.php

(1)今回の変更は1行だけです。

$keyword = str_replace(" ", " ", $keyword);

$keyword = ereg_replace("[  ]+", " ", $keyword);

正規表現を使い「半角か全角の空白が1回以上繰り返す場合」は「半角空白1つ」に置換しています。

これでユーザーによる予想外の空白入力にも対応できるようになりました。


【ワンポイント】

正規表現の部分を工夫することで、「/」「/」や「-」「-」などでもキーワードを区切ることができるようになります。

$keyword = ereg_replace("[  /\/-\-]+", " ", $keyword);

特殊な意味を持つ文字は「\」でエスケープします。「\」はWindowsではエンマークのことです。最初か最後に置かないと動かない文字もありますので注意してください。

正規表現は強力ですので、メールアドレスや電話番号に適した値かチェックすることもできます。正規表現を覚えると文字列を扱うプログラムの応用範囲がグッと広がりますので、ぜひ挑戦してみてください。


スポンサードリンク

スポンサードリンク






PHP初心者入門講座TOPへ