PHPを使って検索文字列を取得する方法

このQ&Aのポイント
  • PHPを使用して、リファラーから検索文字列を取得する方法について説明します。
  • リファラーから取得した検索文字列に含まれるスペースや記号によって、文字列の連続がうまくいかない場合があります。
  • mb_parse_str()関数やmb_convert_kana()関数を使用して、検索文字列を解析し正しく取得することができます。
回答を見る
  • ベストアンサー

文字列の変換について

PHPを用いて、リファラーから検索文字列を取得するスクリプトを作成しています。下記のような感じです。ただ、検索文字列にスペースが連続していたり、「ホテル、予約」「時刻表・東京」などのように「、」や「・」があると文字列が連続してしまい、うまくいきません。 よろしくお願いします。 $ref=split('\?','http://hogehoge.com?q=リファラー'); mb_parse_str($ref[1],$q); foreach($q as $key => $value){ if($key=='p' or $key=='q'){ // yahooとgoogleだけ調べると仮定 $value=mb_convert_kana($value,'rnKs'); $keyword=split(' ',$value); foreach($keyword as $k){ echo $k; } } }

  • PHP
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • hide1978
  • ベストアンサー率42% (32/75)
回答No.2

こんな感じで如何でしょう。 $ref = split('\?', '​http://hogehoge.com?q=​リファラー'); mb_parse_str($ref[1], $q); foreach($q as $key => $value) { if($key == 'p' || $key == 'q') { $value = mb_convert_kana($value, 'rnKs'); $targetValues = array('・', '、', ' '); //(1-1) $value = str_replace($targetValues, ' ', $value); //(1-2) $value = preg_replace('/\r|\r\n|\n/', ' ', $value); //(2) $value = preg_replace('/\s\s+/', ' ', $value); //(3) $value = trim($value); //(4) $keyword = split(' ', $value); foreach($keyword as $k) { echo $k; } } } (1-1)で変換対象文字を配列に定義し、(1-2)で「・」「、」「全角スペース」を半角スペースに変換します。次に(2)で改行文字列を半角スペースに変換。(3)で連続する2つ以上の半角スペースを1つにまとめます。 最後に(4)部分で対象文字列の前後に含まれる半角スペースを除去。 取得する文字列に改行文字列が含まれない場合や、対象文字列の前後にスペースが入らないという確信があるなら(3)や(4)部分は省いても良いと思います。 ですが、私なら念のために入れておきます。 後はご自身で書いている通り、半角スペースで分割すれば良いでしょう。動作確認はしていませんので参考までに。

5454545454
質問者

お礼

希望通りの文字列が取得できました。 本当にありがとうございました。

その他の回答 (2)

  • hide1978
  • ベストアンサー率42% (32/75)
回答No.3

2番目の回答者です。 訂正:1行目はコレ↓の間違い。余計な文字列が入っちゃいました。orz $ref = split('\?', 'http://hogehoge.com?q=リファラー');

  • mutoron2
  • ベストアンサー率24% (6/25)
回答No.1

よくわかりませんが、まず最初に文字列を成型してから検索してはどうですか? スペースが複数あったら、1つにするとか。 「、」や「・」はスペースに変換するとか。

5454545454
質問者

補足

>>よくわかりませんが、まず最初に文字列を成型してから検索してはどうですか? スペースが複数あったら、1つにするとか。 「、」や「・」はスペースに変換するとか。 その方法をお伺いしたいのですが。

関連するQ&A

  • 配列の中の文字列の文字コードを変換させる関数

    配列に入っている全ての文字列の文字コードを変換させる関数ってもともとありますか? なければ自分で作ることになりますが、 どのようにつくればいいのでしょうか? (配列の中の構造は一定でないとします) 配列の中の構造が一定ならば foreach($arr as $key=>$value){ $arr[$key] = mb_convert_encoding($value,'SJIS','auto'); } のようになりますが、 配列の中の構造が一定でないとこれではだめでした。 何かいい方法はありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • ある文字を含む文字列のみ配列にする方法

    var_dump($text); を行うと array(1) { [0]=> string(XX) "あいさつ" } array(1) { [0]=> string(XX) "いい日旅立ち" } array(1) { [0]=> string(XX) "りんご、うまい" } array(1) { [0]=> string(XX) "メロン好き" } …… となるような変数 $text があり、そこから $key = array("ばなな","りんご","メロン"); の配列内にある文字列を含むものだけを新たに格納したいです。 自分では foreach($text as $value){ if(in_array($value, $key)){ $key_text[] = $value; } } と書いて試したのですが、NULLと返ってきてしまいます。 どうやって書けばいいか教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字列変換

    $word = 'abc'; &word_check($FORM{'comment'}); sub word_check { local($wd) = @_; local($flag); foreach ( split(/,+/, $word) ) { if (index($wd,$_) >= 0) { $flag=1; last; } } if ($flag) { $FORM{'comment'} =~ s/($word)/【文字変換$1】/g; } } $FORM{'comment'}に$wordの文字列が含まれていた場合には対象文字列を変換しようと考えています。 上記のように$wordにabcのみでしたらうまく変換されるのですが、 $word = 'abc,123';というように複数指定した場合にうまくいきません。 繰り返す処理を使うのだと思いますが、あまり知識がないため、うまく出来ません。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 特殊文字をHTMLエンティティに変換する処理

    下記の処理とhtmlspecialchars関数との違いはなんですか? 2次元配列がよくわかりません。 function entity_assoc_array($assoc_array) { foreach ($assoc_array as $key => $value) { foreach ($value as $keys => $values) { // 特殊文字をHTMLエンティティに変換する $assoc_array[$key][$keys] = entity_str($values); } } return $assoc_array; }

    • ベストアンサー
    • PHP
  • ある文字を含む文字列のみ配列にする

    何度もすみません。 array(XX) { [0]=> array(2) { ["text"]=> string(YY) "りんご美味しい" ["name"]=> string(Z) "あいこ" } [1]=> array(2) { ["text"]=> string(XX) "富士山登りたい" ["name"]=> string(Z) "みほ" } [2]=> array(2) { ["text"]=> string(XX) "動物園行きたい" ["name"]=> string(Z) "なほ" } [3]=> array(2) { ["text"]=> string(XX) "メロン美味しい" ["name"]=> string(Z) "ゆい" } [4]=> array(2) { ["text"]=> string(XX) "お腹すいた" ["name"]=> string(Z) "まこ" } [5]=> array(2) { ["text"]=> string(XX) "数学やだー" ["name"]=> string(Z) "あいこ" } ……… } のような配列$textがあり、そこから["text"]に $keyword = array("りんご","メロン") の文字列を含むものだけ取り出したいです。 今までもらった回答を参考に $key_text = array(); foreach($text as $key => $v1){ foreach($keyword as $v2){ if(strpos($v1[text], $v2) !== false){ $key_text[] = $key; } } } と書いてみたのですが、上手く動作しません。 よろしければどこが間違っているかご指摘ください。 お願いします。

    • ベストアンサー
    • PHP
  • 文字列が数値に変換されない

    文字列の数字をVALUE関数で数値に変換したくても数値になりません。 ♯N/Aと表示されるだけです。 関数を入れたあとに表示形式を数値にしても変わりません。 元の文字列はVLOOKUP関数で検索した数字です。 これができないと仕事が進みません。急いでます。お願いします。

  • PHP検索 完全一致のみヒット

    詳しくないので質問内容におかしな点が多々あるかと思いますが・・ サイト内検索でcsvファイルから文字列を呼び出し一致した文字列を出力するというスクリプトで 完全に一致した文字列だけ出力させたいのですが、 たとえばcsvに「AAA」「ABC」「ARZ」のデータがあり 「A」で検索しても何も出力されず、「AAA」と検索した時だけ「AAA」だけを出力したいのですが 「A」で検索すると「A」から始まる全ての文字列(↑で挙げた文字列全て)が出力されてしまって困っています。 どの部分を変えると完全に一致した文字列だけを検索できるようになるのか指摘してくださればと思います。 <?php function funcSiteLink($str, $pass, $csvFileName){ if($str){ $keyword = mb_convert_kana($str, "s","SJIS"); $arr_keyword = preg_split('/[\s]+/', $keyword, -1, PREG_SPLIT_NO_EMPTY); $file = fopen($csvFileName,"r"); $i = 0; while(!feof($file)){ $csv = fgets($file); $str = explode(",", $csv); $keywordPassArr[$i] = $str; $i++; } $judg = 0; foreach($arr_keyword as $val){ foreach($keywordPassArr as $kpa){ preg_match("/$val/", $kpa[0], $matches, PREG_OFFSET_CAPTURE); if($matches[0][1] === 0){ echo '<p><a href="'.$pass .$kpa[1] .'">' .$kpa[0] .'</a></p>'; $judg++; } } } if($judg === 0){ echo "<p>一致しません</p>"; } fclose($file); }else{ echo "<p>一致しません</p>"; } } ?>

    • ベストアンサー
    • PHP
  • PHP正規表現

    数字と.の文字列から 最初の.だけ残して 後の.は取り除きたいです。 *必ず数値.数値の形です。 文字列例→期待する値 12.12→12.12 121.152.4.2→121.15242 6.2.4→6.24 $varr = preg_split("/\./","6.2.4"); $varr[0] = "{$varr[0]}."; foreach($varr as $value){ $str .= $value; } echo $str; で出来るのですが、頭悪い感じがして 正規表現で1行とかできませんかねぇ

    • ベストアンサー
    • PHP
  • ASCII文字列をEUCなどに変換したいができない

    いつもお世話になっております。 ファイルの文字コードがEUCのファイルの中に、 なぜか、文字コードがASCIIである文字列があります。 この文字列は、外部から受け取るカタチなので、 これはこれで、ASCIIでも、しかたないのかなという風に思い、 それならば、受け取った後、EUCに変換すればいいやと考え、 mb_convert_encoding($var,"EUC-JP","ASCII")を使って、変換を試みるも、 ASCIIのままなのです。 ASCIIである文字列には、変換されない鉄壁さというものがあるのでしょうか? 変換処理後に、mb_detect_encoding()で検査しますが、やはりASCIIのままです。 それならば!、ということで、 受け取る値(ここでは例として、"This_Value_is_ASCII_Encoding_hogehoge9999")を いったん手動のコピペ操作をして、 $UketoruAtai = "This_Value_is_ASCII_Encoding"; とし、 その値もやはり、ASCII文字列になっているので、 この、手動コピペ文字列ならば文字コードの変換はできるだろうと思い、 上記のmb_convert_encoding()の処理をしたわけですが、 この場合でも、やはり ASCIIは鉄壁でした。 いったい、これは、なんなんでしょうか、、、。 ちなみに、このASCII文字列は、英数字のみ(当たり前か。笑)の文字列です。 このASCII文字列を、EUC-JPにする手助けを、どなたか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 連続する文字列を検索するには

    教えてgooで連続する文字を検索するにはどうしたらいいのでしょうか? 例えば教えてgooで「連続する文字」と検索すると、今現在では「textの連続記入」、「画面の文字をキャプチャし、クリップボードに退避してくれるツール」、「絶版商品、だけど好きだった。 」……という質問が検索されます。これらの質問を見ても「連続する文字」という文字列は見当たりません。どうやら、その結果検索されるのは「連続」、「する」、「文字」が文中などにある質問が検索されるようです。でも、私は「連続する文字」という文字列がある質問を検索したいのです。 こういうのは無理なのでしょうか?