• 締切済み

サイト内検索で複数の言葉にマッチさせるには

簡素な検索エンジンを作りたいんですが 複数の言葉にマッチする仕組みが作れなくて困っています たとえば 検索したい文が$str 複数のキーワードが$key=array("AAA","BBB",....)だったとして for($j=0;$j<count($key);$j++){ if(mb_ereg_match("$key[$j]",$str)){print "HIT";} } だと只のor検索、$keyの中身を(AAA|BBB|...)の形に変えてpreg_matchさせても当然or検索 なにか複数の単語にマッチさせる方法はありませんでしょうか?

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

foreachで回すとか? <?PHP $str=<<<eof aaa bbb ccc ddd eof; $keys=array("aaa","bbb"); $flg=true; foreach($keys as $val){ if(!preg_match("/{$val}/",$str)){ $flg=false; break; } } if($flg) print "HIT"; ?>

yozuki
質問者

お礼

ヒットを探すのではなく、ヒットしなかったら無視するという考え方ですか。なるほど参考になりました、ありがとうございます!

関連するQ&A

  • 【PHP】「ereg_match」はなぜ不人気なのか?

    PHP初心者です。 現在ファイルの中を英語や日本語で検索するプログラムを作っています。 検索といえば「preg_match」が一番人気あるように見えます。しかしたとえば、 mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); if(preg_match( '/我輩は.である/' ,'我輩は猫である')){ print "マッチ!"; } 上記のような使い方をすると「.」は「猫」にマッチせず「...」にするとようやくマッチします。「preg_match」はマルチバイトに対応していないのでしょうか。 そこでマルチバイトと正規表現に対応した検索関数「mb_ereg_match」を知りました。 if(mb_ereg_match( '我輩は.である' ,'我輩は猫である')){ これなら正常にマッチします。 がしかし… 「mb_ereg_match」は全然辞書に載ってません。分厚いPHP辞書をいくつも持ってますが「ereg_match」すら載ってません。何か不人気の理由があるのでしょうか?気に入ったのに不安で使えません。 お詳しい方、解説よろしくお願いいたします。

    • 締切済み
    • PHP
  • 配列のキー取得

    現在の$str配列には、下記のようになっています。 Array ( [9] => test [5] => aaa [7] => bbb) print_r(array_keys($str)); とすると下記のように配列のキー値がわかりますが、 Array ( [0] => 9 [1] => 5 [2] => 7) キーを下記のように一つづつほかの配列に代入したい場合はどのようにしたらいいのでしょうか? for($i=0;$i<count($str);$i++){ $new_str[$i]=キーを取得する関数; } ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現でのマッチを複数取得したい

    正規表現にて、文字列のhtmlタグ部のみを配列にして取得したいのですが、初めにマッチする1つしか返り値を取得できません。 ----ソース--------------------- $this->target_str <<<EOS <test1>aaa</test1> <test2>bbb</test2> EOS; preg_match ( "/<.*?>/imsu" , $this->target_str, $RES_ARR ); ------------------------------- 上の例だと、 $RES_ARR[0] => "<test1>" となり、残りのタグは取得できないのです。 google検索にて発見した、'マッチした後も続けて検索する'というオプション'g'をつけてみたのですが、'g'に対してエラーが出てしまいます。 どなたか解決策をお持ちの方いらっしゃいましたらよろしくお願いします!

    • ベストアンサー
    • PHP
  • "【"と"】"でサンドされたキーワードを検索したい

    PHPでpreg_matchをつかい、"【"と"】"でサンドされたキーワードを検索したいです。 たとえば以下のパターンがあるとします。 1.【拡散希望】 2.【これ拡散】 3.【拡散してね】 4.【また拡散よろしく】 5.【お願い】拡散 この場合、"【"と"】"と"拡散"をpreg_matchでさがせばすべて検出できますが、 (こんな感じ)---------------------------------------- if(preg_match('/【/', $value->text) && preg_match('/拡散/', $value->text) && preg_match('/】/', $value->text) ) ------------------------------------------------------- 5番のパターンは条件からはずして1~4の場合のようにサンドされたものだけマッチングさせたいんです。 拡散というワードの前後は不特定なので【】内に拡散と文字が入った場合のパターンを検出する書き方はないでしょうか? ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • mb_ereg_replaceについて

    マルチバイトでの置き換えについて質問です。現在は以下のように str_replaceで置き換えしており文字化けはないのですがマルチバイト 対応のmb_ereg_replaceで実行したほうがいい事を知りました。 以下現在のソースです。 // 検索文配列 $search = array("{#aaa#}", "{#bbb#}", "{#ccc#}"); // 置き換え文配列 $replace = array("あああ", "いいい", "ううう"); // 置き換え $str = str_replace($search, $replace, $str); 単純にstr_replaceをmb_ereg_replaceにしてみたのですがエラーに なってしまいました。 置き換えしたい文字が複数あるのでできれば検索文字、置き換え文字を 配列として使用したいのですがどうすればいいのでしょうか? ちなみにですが文字コードはutf-8です。

    • ベストアンサー
    • PHP
  • preg_match_allで取得データをDBへ

    質問:preg_match_allで取得したデータをDBへ格納したいです。 記述文 $pattern = "|HREF=.*?\>|"; preg_match_all($pattern,$str,$match); 補足: $pattern で指定範囲を書いてます。 $str には $patternでとってくる参照データ先が入ってきます。 print_r($match); で念のためブラウザに吐き出すと Array ( [0] => Array ( [0] => HREF="AAA"> [1] => HREF="../../../../Top"> 以下省略 取得したい範囲が取れていることは確認できました。 目的は、とってきた [0] => HREF="AAA"> [1] => HREF="../../../../Top"> : =>より先の文字列が、DBの1つのレコードに1つずつ入っていくイメージです。 アドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • preg_replace 後方参照

    preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){  $str = preg_replace("/^\d+/", "", $str);  $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? (  perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )

    • ベストアンサー
    • PHP
  • 自作の検索エンジンを作成しました。AND検索 or 検索の方法をご教授いただきたい。

    こんにちは。 複数のキーワードの検索が出来ません。 ゲーム 無料 等のキーワードで検索した場合のwhere句とのコラボ組み合わせが出来ません。 $keyword=$_POST[1]; $rs=$DB->$query("SELECT * FROM data WHERE"; if($keyword){ $str = array(" ", " and ", " AND "); $keyword = str_replace($str, " ", $keyword); if(stristr($keyword, " ")){//複数キーワードの検索 $ex = explode(" ", $keyword); $count = count($exkey); for($i=0; $i<$count; $i++){ if($i!="0"){ $sql = $sql." and"; } $sql = $sql." keyword LIKE '%{$ex[$i]}%'"); } }else{//単体キーワードの検索 $sql = " keyword LIKE '%{$keyword}%'"); } } $query = $query.$sql; $result = mysql_query($query); ...結果表示 これ今のソースですけど for のあたりに何か必要ない文字とか入っていますか。 色々しているうちに無駄に複雑にしてしまっているのではと言う感じもします。

    • ベストアンサー
    • PHP
  • 複数行になっている文字列を検索したい

    PERL初心者です。 以下、テキストに複数行になっている箇所の2行目の「BBB」を検索キーとして 3行目の「CCC」を取得したいのと2行目、3行目を1レコードにしたいのですが できません。 test.txt ---------------------------------- 1. AAA BBB CCC DDDD 2. AAA BBB 3. CCC DDDD 4. AAA BBB CCC DDDD ----------------------------------- 以上よろしくお願いします。

  • 不要な配列を消したい

    2次元配列で、不要な要素を取り除きたいのですが良い方法が思い浮かばず、どうしたものかと悩んでいます。 一番初めと5番目を消したいのですが、preg_match で日付の2006にマッチしない要素をunsetしてみましたがうまくいきませんでした。 $data = array ( array('<br>'), array("2006 03 22", test), array("2006 03 23", test2), array("2006 03 25", test3), array('') ); $pattern = '/2006/'; foreach($data as $key => $value) { if(preg_match($pattern, $value[$key])) { unset($data[$key]); } } もし方法をご存知のかたおられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう