hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

preg_splitで検索キーワードをスペース分割して配列に入れる方法

preg_splitを使用すると、指定した正規表現によって文字列を区切って配列を作ってくれます。
サイト等で入力された検索キーワード等をスペースで区切って検索条件の設定をするのにスゴク便利に使えます。
が、ちょっとだけ落とし穴があったので、備忘録として書いておきます。

preg_split使用のダメな例

以下のコードは2つの問題を含んでいます。

  1. preg_splitで全角スペースも含めて分割しているが、preg_splitは全角文字に未対応のため、文字化けが発生する。
  2. 連続したスペースが入力された場合、配列に空文字(null)が設定される場合がある。

1.の問題点は、事前に全角→半角変換を行うことで対処できます。
2.の問題点は、正規表現の書き方 or preg_splitのオプションパラメタで対処できます。

コードサンプル(ダメな例)
<?php
$ary_keyword = preg_split('/[  ]/', $keyword); //[]内は全角スペース+半角スペース
foreach( $ary_keyword as $val ){
    // 検索条件を設定するコードをここに書く
}
?>

preg_split使用の良い例

上記の2つの問題に対処したコードが以下になります。
上記のコードサンプルからの修正点としては、

  1. preg_splitの前に「mb_convert_kana($keyword, 's')」を行い、全角スペースを半角スペースに変換。
  2. preg_splitの正規表現を「/[\s]+/」にして、1つ以上の連続した半角スペースで分割させる。
  3. preg_splitで「PREG_SPLIT_NO_EMPTY」を指定して、空文字列以外だけを返すようにする。

になります。
1.の対策は、preg_splitでの文字化け防止のためです。(全角スペースでの分割をやらないため)
2.と3.は、配列へ空文字(null)が設定されてしまう問題への対策になります。これは両方を実装しなくともどちらか一方を実装すれば、対策としてはOKかと思います。
※下記のコード例は便宜上、2.と3.の両方を実装しています。

コードサンプル(良い例)
<?php
$keyword = mb_convert_kana($keyword, 's')
$ary_keyword = preg_split('/[\s]+/', $keyword, -1, PREG_SPLIT_NO_EMPTY);
foreach( $ary_keyword as $val ){
    // 検索条件を設定するコードをここに書く
}
?>

最初に「落とし穴」と書きましたが、「PREG_SPLIT_NO_EMPTY」とかはマニュアルを読めば分かることだったので、やっぱりマニュアルにはちゃんと目を通さないとだめだなー、と痛感させられました。

今回参考にしたページ

preg_split - PHP Manual
http://php.net/manual/ja/function.preg-split.php

複数の検索語をハイライトしたいときの簡単なPHPのコード - zuzara
http://blog.zuzara.com/2006/05/01/66/