PHP 検索キーワードを正規表現で置換する方法。

前回までに作成したPHPプログラムの課題は、ユーザーが検索用のテキストボックスにキーワードを入力するときに、以下の条件で不具合が起こることです。

・空白を2つ以上続けて入力した
・キーワードの先頭および末尾に空白を入力した

プログラムの中で検索ボックスに入力されたキーワードを、半角スペースで区切って取り出しているので、空白が複数続くと空白自体がキーワードとなります。そうするとSQL文で「PREF_NAME LIKE '%%'」となるため、「OR」条件のときに全てのレコードが抽出されてしまいます。

php-260.gif

「山」と「岡」の間、「岡」の後ろに複数の空白があるので全件表示されていますね。

これを防ぐには正規表現を使い、1つ目の空白だけ残し2つ以上の空白を除くようにプログラムすると解決できます。

正規表現は強力ですが奥が深く、正規表現だけで1冊の本になるほどです。そのため検索機能を実現するのに必要なことに限定して解説します。

またいきなり都道府県マスターのプログラムに組み込むと難しく感じますので、今回は文字列を分割するための、最も基本的な部分だけを抜き出してプログラムを書きました。

$keywordという変数に文字列を代入していますが、これを検索ボックスに入力されたキーワードだと考えてください。


【1】sample108 フォルダをコピーして sample109 フォルダを作成します。

php-252.gif


【2】今回は以下のようなファイルの構成になります。

php-253.gif

・test.phpを新規に作成します。
・search.phpは次回に変更しますので、今回はそのままでかまいません。
・他のファイルは前回の sample108 と同じものなので、ソースコードは省略します。

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

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

<html>
  <head>
    <title>テスト</title>
  </head>
  <body>

    <?php
      $keyword = "  あいうえお    かきくけこ さしすせそ   ";
      print "加工前:".$keyword."<br />\n";
      $keyword = ereg_replace("[  ]+", " ", $keyword);
      print "置換後:".$keyword."<br />\n";
      $keyword = trim($keyword);
      print "trim有 :".$keyword."<br />\n";

      print "<br />\n";

      $array = explode(" ", $keyword);
      print "要素数:".count($array)."<br />\n";
      print_r($array);

    ?>

  </body>
</html>



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

php-02.gif

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


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


【5】test.php の画面が表示されました。

php-254.gif


【6】分かりやすいように、マウスで以下の部分を選択し反転させます。

php-255.gif

・加工前は文字列中に半角と全角の空白が複数入っていて、文字列の先頭および末尾にも空白が入っています。

・置換後は「複数の半角と全角の空白」を「1つの半角空白に置換」した結果です。しかしよく見ると文字列の先頭および末尾にまだ空白が残っています。

・trim有は文字列の先頭および末尾にある空白が除かれた結果です。置換後と比べると少しだけ左寄りになっていますね。

・要素数は半角空白で区切って配列に代入された文字列の数です。

・最後に配列の中身を出力しています。0からはじまるキーと要素を表す形式で表示しています。


もし trim() で文字列の前後の空白を除かなかったら、以下のような結果になります。

php-256.gif

この動作を確認するには、trimのある行を // でコメントにしてください。
//$keyword = trim($keyword);

trimが無いと最初と最後の空白まで区切ってしまうため、配列に空白が入ります。これをそのままにしておくと「PREF_NAME LIKE '%%'」となる原因になります。


【7】$keyword に代入する文字列に空白を混ぜて、思ったように文字列が区切られるか、動作をテストしてください。


【解説】

半角と全角の空白の違いが確認しにくいので、TeraPadの画面もご覧ください。

(1)$keyword にわざと半角や全角の空白を複数入れています。
$keyword = "  あいうえお    かきくけこ さしすせそ   ";

php-257.gif

*この代入する文字列が、検索用のテキストボックスに入力されたキーワードだとイメージしてください。文字列をいろいろ変えることでテストできます。


(2)半角か全角の空白が1回以上繰り返す場合は、「半角空白1つ」に置換しています。
$keyword = ereg_replace("[  ]+", " ", $keyword);

php-258.gif

ereg_replace()関数は正規表現による置換を行ないます。
ereg_replace(正規表現, 置換文字列, 対象文字列);

[  ] 半角か全角の空白 *[ ]カッコ内の文字のいずれかに該当
+ 1回以上繰り返す
" " 半角空白1つ

この書き方だと、もともと半角空白1つの場合でも置換されるので無駄になりますが、表現が簡単なのでそうしました。


(3)文字列の先頭および末尾にある空白を取り除いています。
$keyword = trim($keyword);

ただしtrim()は半角の空白が対象で、全角空白は削除の対象外なので気をつけなければなりません。そのためあらかじめ ereg_replace()関数で全角を半角に置換しています。


(4)文字列を半角空白で区切り、配列に代入しています。
$array = explode(" ", $keyword);

explode()関数は、文字列を指定した文字により分割し、結果を配列で返します。


(5)配列の要素数を数え、画面に表示しています。
print "要素数:".count($array)."<br />\n";

count()関数は変数に含まれる要素数を数えます。


(6)配列の中身を解りやすく出力しています。
print_r($array);

print_r()を使うと、キーと要素を表す形式で配列の値が表示されます。


【ワンポイント】

他にも split()関数を使う方法もあります。この関数は正規表現により文字列を分割し、配列に格納します。


*各関数についての詳細はPHPサイトでマニュアルをご覧ください。
http://www.php.net/


あとは今回のプログラムを search.php に組み込むだけです。といっても1行の変更で済みます。それでは次回をお楽しみに。


スポンサードリンク

スポンサードリンク






PHP初心者入門講座TOPへ