• 締切済み

検索時エラー

はじめまして PHPを用いてsystem.csv内を検索するんですが、ある文字を入力すると Warning: eregi() [function.eregi]: REG_BADRPT と表示されてしまいます。 例えば: 藤、++ などです。 なぜでしょうか? またどのように修正してあげたらいいのでしょうか? よろしくお願いいたします。 <?php if($_GET["key"]==""){ print"キーワードを入力してくださいね"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto"); $Result=array(); $Data=file("system.csv"); for($i=0;$i<sizeof($Data);$i++){ $lines=strip_tags($Data[$i]); if(eregi($KeyWord,$lines,$text_b)){ array_push($Result,$Data[$i]); } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<sizeof($Result);$i++){ $line=explode(",",$Result[$i]); ?> <li><?=$line[2]?><a href="item.php?id=<?=$line[0]?>"><?=$line[1]?></a></li> <?php } } } ?>

noname#184276
noname#184276
  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

こんばんは。 >>$KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto"); このautoは曲者で・・・。 この時点で化けてませんか?

  • nicolish
  • ベストアンサー率72% (13/18)
回答No.1

端的に言うと、eregiはバイナリセーフじゃないから。 マルチバイト文字列、つまり日本語や中国語を正しく扱えない。 ttp://jp2.php.net/manual/ja/intro.regex.php ereg関数は時代遅れで、実際将来的にPHP標準から外される事が確定している。 preg関数を使う事をオススメする。今回の場合preg_matchかな。 それと、単純に文字列を探すならstrposでじゅうぶん。 扱うのがEUC-JPならstrposでいいと思うけど、安全策をとるならmb_strpos。

noname#184276
質問者

補足

お返事ありがとうございます。 preg_matchを用いて検索してみたんですが、やはり 藤 などの文字を検索するとエラー(preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 0 )が発生します。

関連するQ&A

  • CSVファイルの10件表示について

    PHP初心者です。 CSVデータを活用してサイトを作ろうとしているのですが、 フリーワードで検索すると下記のようなエラーが出てしまいます。 Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 77287300 bytes) in レンタルサーバー(ロリポップ)に memory_limitについて問い合わせたところ、 消費メモリを削減して対処してほしいと言われました。 10件だけ表示するようにすれば解決するかと思い、 自分なりにあれこれいじってみたのですが、 うまくいきませんでした。 10件だけ表示する方法やメモリ消費を抑える方法を お分かりになる方がいらっしゃいましたら、 ぜひご教授お願いいたします。 -index.php-トップページ <form action="search.php" method="get"><input type="text" name="key" size="90"> <input type="submit" name="submit" value="検索"></form> -seach.php-検索結果表示ページ <?php if($_GET["key"]==""){ print"キーワードを入力してください"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"Shift_JIS"); $KeyWord=mb_convert_kana($KeyWord,s); $ArrKeyword=explode(" ",$KeyWord); $Result=array(); $Data=file("item.csv"); for($i=0;$i<sizeof($Result);$i++){ $lines=strip_tags($Data[$i]); $Match=true; for($n=0;$n<sizeof($ArrKeyword);$n++){ if(!eregi($ArrKeyword[$n],$lines)){ $Match=false; break; } } if($Match==true){ array_push($Result,$Data[$i]); } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<sizeof($Result);$i++){ $line=explode(",",$Result[$i]); ?> <li><a href="item.php?id=<?=$line[0]?>"><?=$line[3]?></a></li> <?php } } } ?> 下記の行がエラーのようです。 for($i=0;$i<sizeof($Result);$i++){

    • ベストアンサー
    • PHP
  • 検索プログラムの10件表示について

    私はPHPの初心者ですが、ステップアップを兼ねてサイト内検索を作ろうかと思っています。 今回こちらのサイト様(​http://affiliate.aki-f.com/prog/cat/cat9.html​)を参考にさせて頂きました。 ・絞込み検索(and検索) ・1ページを10件表示に制限する 上記のサンプルプログラムを組み合わせてみたのですが 表示結果に問題があり、なんとか修正できないかと思い投稿させて頂きました。 ------------------------表示結果------------------------ 2件見つかりました。全2件 | 次の10件 ・JavaScriptハッカーズ・プログラミング ・コピーするだけですぐに使えるJavaScript ・<空白> ・<空白> ・<空白> ・<空白> ・<空白> ・<空白> ・<空白> ・<空白> -------------------------------------------------------- 2件表示のはずが、10件表示されてしまいます。 さらに、2件しか該当していないに「次の10件」まで表示されてしまいます。 なんとか、検索結果に基づいた表示にしたいのですが どなたか知恵を貸していただければと思います。 宜しくお願い致します。 --------------------------ソース------------------------- if($_GET["key"]==""){ print"キーワードを入力してください"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto"); $KeyWord=mb_convert_kana($KeyWord,s); $ArrKeyword=explode(" ",$KeyWord); $Result=array(); $Data=file("item.csv"); for($i=0;$i<sizeof($Data);$i++){ $lines=strip_tags($Data[$i]); $Match=true; for($n=0;$n<sizeof($ArrKeyword);$n++){ if(!eregi($ArrKeyword[$n],$lines)){ $Match=false; break; } } if($Match==true){ array_push($Result,$Data[$i]); } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <?php $P=$_GET["p"]; if($P>0){ $Prev=$P-1; $PrevPage="<a href='allitem.php?p={$Prev}'>前の10件</a>"; } $Size=sizeof($Result); if($Size/10-1>$P){ $Next=$P+1; $NextPage="<a href='allitem.php?p={$Next}'>次の10件</a>"; } ?> 全<?=$Size?>件 | <?=$PrevPage?> <?=$NextPage?> <ul> <?php for($i=$P*10;$i<$P*10+10;$i++){ $line=explode(",",$Result[$i]); $ID=$line[0]; $Title=strip_tags($line[3]); print"<li><a href='item.php?id={$ID}'>{$Title}</a></li>"; } ?> <?php } } ?> </ul> ----------------------------------------------------------

    • ベストアンサー
    • PHP
  • CSVファイルの検索結果表示について

    CSVファイルを検索して検索結果を表示したいのですが、 検索結果を表示できません。 トップページ <form action="search.php" method="get"><input type="text" name="key" size="90"> <input type="submit" name="submit" value="検索"></form> 検索結果を表示するページ <?php $ArrKeywordLength = sizeof($ArrKeyword); $fp = fopen('data.csv', "r"); $Result=array(); while(!feof($fp)){ $ret = fgets($fp, 4096); $lines = strip_tags($ret); $Match=true; for($n=0; $n<$ArrKeywordLength;$n++){ if(!strpos($ArrKeyword[$n], $lines)){ $Match = false; break; } } if($Match === true){ $Result[] = $ret; } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<10;$i++){ $line=explode(",",$Result[$i]); ?> <li><a href="item.php?id=<?=$line[0]?>"><?=$line[1]?></a></li> <?php } } ?> </ul> 上記のプログラムを実行すると、以下のようになってしまいます。 ○件見つかりました ・ ・ ・ ・ ・ 私のやりたいことは、以下のようなCSVファイルがあったら ----------------------------------------------------- CSVファイル 1,あいうえお 2,かきくけこ 3,さしすせそ 4,たちつてと 5,なにぬねの ----------------------------------------------------- <li><a href="item.php?id=1">あいうえお</a></li> <li><a href="item.php?id=2">かきくけこ</a></li> <li><a href="item.php?id=3">さしすせそ</a></li> <li><a href="item.php?id=4">たちつてと</a></li> <li><a href="item.php?id=5">なにぬねの</a></li> のように出力したいのですが、 どのように改良すればよいのでしょうか? わかってる方からすれば笑われるようなことかもしれませんが、 PHP初心者なので、本を読みながらいろいろ試してみても、 全然うまくいかないので、どなたか教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • スペース区切りの絞込検索

    現在CSVファイルを利用した簡易検索を作っています。 他の質問にも似たようながありましたがsqlの知識もなく理解できなかったので新規で質問致しました。 複数のキーワードをどうしてもスペース区切りでの絞込検索ができなく悩んでいます。 大変恐縮ですが、お知恵をお借りできればと思い 書き込みさせていただきました。 現在自分で書いたコードは下記です。 大変お手数ですがお教えいただけると幸いです。 宜しくお願い致します。 <?PHP $KeyWord=$_GET["key"]; $ArrKeyword=explode(" ",$KeyWord); $f = 0; $Data=file("data.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=$Data[$i]; for($n=0;$n<sizeof($ArrKeyword);$n++){ //このあたりが理解できていません・・ if(mb_eregi($ArrKeyword[$n],$line)){ $lines = $line; } $kensaku_kekka[$f] = $lines; $f = $f+1; break; } } print_r($kensaku_kekka); ?>

    • ベストアンサー
    • PHP
  • スペース区切りの検索について

    現在PHP+CSVで簡易検索を作りましたが この度それをMYSQLで実現させようかと考えていますが 以前のような単純なCSV検索と同様の事が MYSQLのwhere句の部分で表現できなく困っています。 ■data.csv 鈴木一郎,野球選手,東京都新宿区 鈴木次郎,サッカー選手,東京都新宿区 検索方法(andで絞込み) キーワードを何も入れなければ全件出力。 たとえば検索キーとして 「鈴木」 「野球」と入れれば1行目が表示されるイメージです。 ■PHP+CSV $ArrKeyword=explode(" ",$KeyWord); $Data=file("data.csv"); for ($i = 0; $i < sizeof($Data); $i++) { for ($n = 0, $flag = 1; $n < sizeof($ArrKeyword); $n++) { if (!mb_eregi($ArrKeyword[$n], $Data[$i])){ $flag = 0; break; } } if ($flag) { $kensaku_kekka[] = $Data[$i]; } } ■MYSQL $ArrKeyword=explode(" ",$KeyWord); $where = " WHERE concat(name,com,jyusho) Like '%$ArrKeyword[0]%' "; if($ArrKeyword[1]){ for($i = 1; $i < sizeof($ArrKeyword); $i++) { $where .= "AND (concat(name,com,jyusho) like '%$ArrKeyword[i]%' )"; } } $sql = "SELECT * FROM `keigyou_tbl` $where"; //select文を実行 if(!$res=mysql_query("$sql")){ echo "sql失敗"; exit; } ■MYSQL版の場合2個目のキーワードが機能していません。

    • ベストアンサー
    • MySQL
  • CVSからifを使った検索でヒットした件数を表示したい

    いつも参考にさせていただいております。以前は的確な回答をすぐに頂き大変助かりました。 さて、今回の質問なのですが以前の質問(http://oshiete1.goo.ne.jp/qa4202309.html)のときはCSVファイル内部に格納されている指定項目を検索するという内容でしたが、今度はその検索結果を表示する際に何件該当するかカウントを行いたいと考えております。 しかし参考にしたサイトでは検索項目を配列に収め、その配列をCSVの項目に当てはまるものを別の配列に収めるという方式でした。確かにこの方法ならば検索条件に該当する項目を配列に収めその配列のデータ数をsizeof関数を使えば項目数は簡単に出力することが出来ます。 ただ、この場合ですと前回作ったプログラムに沿いません。 自分でもif文でソートした結果を配列に収めようとしましたが、うまくいかず煮詰まってしまいました。 下が自分で考えた(途中までの)ソースになります。 /検索用PHP *検索項目入力に関する記述は省略 $KeyWord=POST_["Word"]; $Data=file("system.csv"); for($i=0;$i<sizeof($Data);$i++){ $lines=strip_tags($Data[$i]); $line=explode(",",$Data[$i]); if ( mb_eregi( $line[0}, $KeyWord )){ (CSVの1番目の項目とPOSTされた"Word"の内容が同じならばCSVからソートし、ソートした内容を処理するソースを記述) }} /system.csv 1,2,3,4 a,b,c,d (*要はif文でソートした件数を表示させたい) ソートした件数をカウントするには処理をifでループする前かif文に合致した場合の処理内部になんらかしらのコードを置かなければならないことはわかりますが、実際のところ何をおけばいいのかわからなくなってしまいました。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • array_spliceでの置き換えについて

    リファラでカウントカウントを図りたいと考えています。 内容としては、http://www.hoge.net/からのアクセスに対して 『hoge』だけと抽出し、格納しているCSVと照合し正ならカウント+1として「array_splice」で置き換えてる 単純なプログラムなのですが書き込まれるCSVに何故か空の行が下記のように挿入されてしまいます。 CSVの中身 --------------------------------------------- 0,http://www.sample.net 0,http://www.hoge.net 0,http://www.test.net 0,http://www.xxxx.net ↓↓↓↓↓↓↓↓↓↓↓ 0,http://www.sample.net 1,http://www.hoge.net [空白] 0,http://www.test.net 0,http://www.xxxx.net --------------------------------------------- また、アクセスする度に空白行が増えていく状況です。 別のプログラムでも「array_splice」は使っていますが いずれも正常に置き換えられています。 ソースを記述しますので何が原因なのかわかりません。 何方かアドバイスを頂ければと思います。 ソース --------------------------------------------- $string = $_SERVER['HTTP_REFERER']; $regex = "(http:\/\/)([^\/]+)(\/.*$)?"; match ( $string, $regex ); function match ( $string, $regex ) { if ( preg_match ( "/".$regex."/i", $string, $match ) ) { $keyURL=$match[2]; $Data=file("../csv/sample.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); if(ereg("$keyURL",$line[1])){ $count="$line[0]" + 1; $lines=array($count,$line[1]); $lines=implode(",",$lines); $lines=$lines."\n"; array_splice($Data,$i,1,$lines); $fp=fopen("../csv/sample.csv","w+"); flock($fp, LOCK_EX); foreach($Data as $item)fputs($fp,$item); fclose($fp); } } } } --------------------------------------------- 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • array_reverse()の使い方について

    array_reverse() の使い方が分かりません・・・。 CSV(降順)のデータを読み込んでPHPで表示する仕組みを作っています。 そのCSVを昇順にしたく、array_reverse() を使っても、思うようにデータが表示されません。 CSV(data.csv)は以下の通りです。価格で降順になっているものです。 line0,line1,line2 1,ぶどう,200(円) 2,なし,150(円) 3,りんご,100(円) 4,バナナ,80(円) 5,みかん,50(円) PHPは以下の通りです。 <?php $Data=file('/data.csv'); $j=0; for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); if($j<3 ){ echo $line1 $line2.' <br />'; $j++; } } ?> $Data を 昇順にしたいので(もともとのCSVを昇順で作ることはできません)、 array_reverse($Data) をどこかに入れたらいいと思うのですが、forの前、後ろといろいろ入れてみたのですが、思ったように表示がされず困っています。 お力おかしください!!!よろしくお願いします。

    • ベストアンサー
    • PHP
  • 条件が不一致の場合の繰り返し処理

    以下のようなCSVがあります。 条件があったときにCSVの内容を表示するようにしているのですが 条件に合わなかったときの処理がわかりません。 以下のままですと「見つかりませんでした」と行数分(4回)表示されてしまいます。 これを一度だけにするにはどうすればよいのでしょうか? --data.csv-- 0,12,A 0,13,B 0,14,C 0,15,D <?php $Data = file("data.csv"); for($i = 0; $i < sizeof($Data); $i++){ $item = explode(",", $Data[$i]); if($item[0] == "0" and $item[1] == "11"){ print $item[3]; }else{ print "見つかりませんでした"; } } ?>

    • 締切済み
    • PHP
  • CSVファイルの上書き

    CSVファイルを$line[0] = $nowの時、上書きするということをしたいのですが、array_spliceでうまくいきません。 アドバイスお願いします。 $fp = fopen('log/order.csv', 'a+'); flock($fp,LOCK_EX); if ($fp) { require_once( "./common.php" ); $AddressData = LoadTextFile( "./log/order.csv", "SJIS", "SJIS" ); if ( $AddressData == false ) { exit; } else { for ( $i = 0; $i < sizeof( $AddressData ); $i++ ) { $line = explode( ",", $AddressData[ $i ] ); if($line[0] = $now){ array_splice($line, 1, 3, array("1","2","3")); #fputs($fp, $buf2); flock($fp,LOCK_UN); fclose($fp); } } } }

    • 締切済み
    • PHP

専門家に質問してみよう