電子書籍の厳選無料作品が豊富!

csvの中の特定の文字をphpで検索する方法を教えてください。
僕がためしたのは以下です。
-------------------------------------------------------------
<?
$PTR = fopen( "./test.csv", "r" );


if( $PTR == FALSE ){ die( "file open error!!" ); }

$Key = $_GET["val"] ;
$Size = strlen( $Key );

while($Str = fgets( $PTR, 1024 ) )
{
$Code = substr( $Str, 0, $Size );

if( $Code === $Key )
{
echo $Str;
break;
}

if( $Key <= $Code ){ break; }
}


fclose( $PTR );
?>
-------------------------------------------------------------
ですが、これだと頭の文字がマッチしなとヒットしないんです。
たとへばcsvに以下が入ってるとします。
あきら
いちご
えなり
この[あきら]をヒットしたい場合、getで渡す文字を[あきら]や[あ]ならヒットします。これを[き]や[ら]だけの文字検索でも[あきら]と表示されるようにしたいのです。
最悪php自体全部変えてもいいので、誰か教えてください。
条件として携帯電話からも検索できるものに限ります。
※機種依存はX

A 回答 (3件)

csvデータなのですよね?


各行の項目は1つしかないのでしょうか?

カンマ区切りで全データを検証するならこんな感じでしょうか

<?
$key = $_GET["val"] ;

$handle = fopen("test.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
foreach($data as $val){
if($key!="" && preg_match("/{$key}/",$val)) print $val;
}
}
fclose($handle);

?>
    • good
    • 0

マルチバイト文字を扱うのなら、mb系の関数を使わないといけないです。


mb_substrとか。
この用途だと、mb_ereg_matchのほうが良いと思います。
http://www.php.net/manual/ja/

それから、
・$_GETから取り出した値は、strip_tagsとかhtmlspecialcharsとかを
 通しておくのがセキュリティ面からみてよいです。
・「条件として携帯電話からも検索できるものに限ります」という事ですが、phpはサーバ側で動くので、検索ロジックの部分については機種依存
しようがないですね。結果を出力する部分は注意が必要です。

この回答への補足

mb_strposを使用してみたんですけど、時々違う文字なのにひっかかるのがあるんですが、やっぱりmb_strposだからなんでしょうか?
phpは詳しくなくてもしmb_ereg_matchを使う場合、mb_strposの行をmb_ereg_matchに変えるだけでいいのでしょうか?
たとえば
// 検索ワードに一致するか確認
if (strlen ($keyword['com'])) {
$found['com'] = mb_strpos ($com, $keyword['com']);
}
の部分を
// 検索ワードに一致するか確認
if (strlen ($keyword['com'])) {
$found['com'] = mb_ereg_match ($com, $keyword['com']);
}
とするだけでよいのでしょうか?

補足日時:2007/06/12 03:47
    • good
    • 0

$Strのどこかに$Keyを含んでいたら$Strを出力する、という仕様に


substr関数はそぐわないと思います。
strstr関数あたり(他にふさわしい関数があるかもしれませんが)に
ついて調べてみてはいかがでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!