preg_matchの対象項目数 - PHPプロ!Q&A掲示板

791

  • 0P

preg_matchの対象項目数

質問日時 / 2007年11月28日 12:12    回答数 / 4件

Questioner:  fainalanswer  このエントリーをはてなブックマークに追加 

キーワード / 正規表現    重複   

いつもお世話になっています。
重複登録がないかcsvファイルの中から、preg_matchにて重複するものがないか複数の項目を探りたいのですが、preg_matchの条件に複数の項目を定められますか?それとも項目ごとにpreg_matchを記述しなければなりませんか?
  1. if (preg_match("$line" , 項目1 項目2...)) {
  2.  処理内容
  3. }
↑こうしたいのですが
  1. if (preg_match("$line" , 項目1)) {
  2.   処理内容
  3. }
  4. elseif (preg_match("$line" , 項目2)) {
  5.   処理内容
  6. }
  7. .
  8. .
  9. .
  10. .
↑じゃないとだめですか?


ツリー一覧

┗A01moochomoochoです。 preg_match()のみで完結させようとせ
 ┗A01-1fainalanswer尋ね方が悪かったようです。すみません。^^; した
  ┗A01-1-1moochomoochoです。 CSV内のデータと登録する内容の比較
   ┗A01-1-1-1fainalanswerコードまで示してもらい、大変感謝しています。 なん

回答一覧

並び替え:

A01
answerermoocho [11月28日 14:43]

moochoです。

preg_match()のみで完結させようとせず、ループを使ってはどうですか?
  1. $csv_line = array("abcdef", "ABCXYZ", "hijklmn"); //サンプルなので適当な値を入れています
  2. foreach ($csv_line as $value) {
  3.   if (preg_match("/^(abc)+/i", $value)) {
  4.     echo "match value: $value\n";
  5.     break;
  6.   }
  7. }

CSVの項目が入っている配列をループさせチェックに渡します。

elseifを使われていたのでマッチした段階でループを止めていますが
マッチした項目数をカウントする場合などはbreakをはずしてください。

サンプルは配列すべてをチェックしますが、
特定項目のみチェックする場合は配列キーを取得するなどして
チェックするかどうか判定させるように書き換えてください。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerfainalanswer [11月28日 17:36]

尋ね方が悪かったようです。すみません。^^;
したいことは以下の手順なんですがよくわからないのです。

1:(すでにデータが書かれた)csvファイルを呼び出し
2:" , " 区切りで内容を分解して配列に収め
3:上記の配列の中身と比較したいデータ(複数)で同一のものがないか調べ(先に訊いたのはこの部分)
4:あれば重複登録の旨を表示させて処理を終了させる

↑こういうのはできるでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyermoocho [11月28日 21:29]

moochoです。

CSV内のデータと登録する内容の比較で間違いないですか?

やり方はいろいろあるでしょうが、
結局のところ上記コードを応用すればできないですか?
  1. // 登録する内容の作成
  2. $put_data = array("abcdef", "ABCXYZ", "hijklmn");
  3.  
  4. $handle = fopen("data.csv", "r");
  5. while (($line = fgetcsv($handle, 1000, ",")) !== FALSE) {
  6.     $num = count($line);
  7.     $diff = 0;
  8.     for ($i=0; $i<$num; $i++) {
  9.         //この場合preg_matchのメリットをあまり感じられないので
  10.         if (0 == strcasecmp($line[$i], $put_data[$i])) {
  11.             $diff++;
  12.         }
  13.     }
  14.     //全項目が一致したときエラーにする場合
  15.     if ($diff == $num) {
  16.         echo "同一のデータが・・・";
  17.     }
  18. }
比較にstrcasecmpを使っていますが、preg_matchで行ったとしても
  1. preg_match("/{$line[$i]}/i", $put_data[$i])
に置き換えることで同じことができますが、
この場合わざわざ正規表現を通すメリットが見当たらないので。

やっていることは一緒ですが
  1. // 登録する内容の作成
  2. $put_data = array("abcdef", "ABCXYZ", "hijklmn");
  3.  
  4. $handle = fopen("data.csv", "r");
  5. while (($line = fgetcsv($handle, 1000, ",")) !== FALSE) {
  6.     if (0 == strcasecmp(implode(",", $line), implode(",", $put_data))) {
  7.       echo "同一のデータが・・・";
  8.     }
  9. }
と置き換えればスリムにできます。

大文字小文字の比較を行わないのであれば
  1. array_diff($line, $put_data)
で簡易に行えますし。

ただし、上記のコードは登録されているすべての項目を比較し、
かつ順番(もしくは配列キー)が同じ場合を想定しているので
任意で置き換えてください。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerfainalanswer [11月30日 17:01]

コードまで示してもらい、大変感謝しています。
なんとかこちらの思う通りに動くようになりました。
ありがとうございます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)