【PHP】preg_matchを使ってサンドされたキーワードを検索する方法

このQ&Aのポイント
  • PHPのpreg_match関数を使用して、【】で囲まれたキーワードを検索したいです。具体的には、【】で括られたキーワード「拡散」をマッチングさせたい場合について考えます。
  • 以下のパターンがあります。「【拡散希望】」「【これ拡散】」「【拡散してね】」「【また拡散よろしく】」「【お願い】拡散」。
  • preg_match関数を使用して、【】で囲まれたキーワードを検出する方法をご教授いただきたいです。
回答を見る
  • ベストアンサー

"【"と"】"でサンドされたキーワードを検索したい

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
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.1

プログラムと $value->text の文字コードが UTF-8 だとすると下記の様な正規表現で出来るかと。 -------------------------------- if (preg_match("/【[^】]*拡散.*】/u", $value->text)) { -------------------------------- UTF-8以外だと「】」を一文字と認識してくれないかも知れません。 ちなみに【】で囲まれた文字列を取出すには後方参照を使うと楽です。 -------------------------------- if (preg_match("/【([^】]*拡散[^】]*)】/u", $value->text, $match_str)) { print $match_str[1]; // 【】で囲まれた文字列が表示される -------------------------------- http://www.kt.rim.or.jp/~kbk/regex/regex.html http://www.php.net/manual/ja/function.preg-match.php http://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php

Chatontter
質問者

お礼

ありがとうございます! $value->textは指定したデータからひっぱってくるだけでUTF-8を指定しているわけではないですがUTF-8になっているテキストデータです。 ちなみにこれ、文頭に"【"がきた場合に限定するには "/^【([^】]*拡散[^】]*)】/u" という書き方でいいんでしょうか? 今、頭についている数字は抜きの状態で あああ【拡散】test というのはNGだけど 【拡散】test はOKっていう感じです

その他の回答 (3)

  • root139
  • ベストアンサー率60% (488/809)
回答No.4

> $value->textは指定したデータからひっぱってくるだけでUTF-8を > 指定しているわけではないですがUTF-8になっているテキストデータです。 それなら大丈夫だと思いますが、プログラムのソースコード自体(厳密に言うと正規表現のパターン文字列)の文字エンコーディングもUTF-8である必要が有るので注意してください。 > ちなみにこれ、文頭に"【"がきた場合に限定するには > "/^【([^】]*拡散[^】]*)】/u" > という書き方でいいんでしょうか? そうですね。それで大丈夫です。

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

先頭からとなるとこうですね $pattern="/(?<=^【)[^】]*拡散.*?(?=】)/m"; preg_match_all($pattern,$str,$match);

Chatontter
質問者

お礼

ありがとうございます。大変参考になりました!

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

いまいち仕様がわからないけどこういうこと? <?PHP $str=<<<eof 1.【拡散希望】test 2.【これ拡散】test 3.【拡散してね】test 4.【また拡散よろしく】test 5.【お願い】拡散 6.【拡散】test eof; $pattern="/(?<=【)(?:[^】]*)拡散(?:.*?)(?=】)/s"; preg_match_all($pattern,$str,$match); print_r($match); ?>

Chatontter
質問者

お礼

そうです!ありがとうございます!ちなみにこれ、文頭に"【"がきた場合に限定するには "/^(?<=【)(?:[^】]*)拡散(?:.*?)(?=】)/s" という書き方でいいんでしょうか? 今、頭についている数字は抜きの状態で あああ【拡散】test というのはNGだけど 【拡散】test はOKっていう感じです

関連するQ&A

  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • カンマ区切りの金額を検索するための、正規表現を教えてください

    PHP4を使っています。 表題のとおりなのですが、 カンマ区切りの金額を検索するための、正規表現を教えていただけないでしょうか? http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-3-14.html を参考に、 $pattern = '^(0|([1-9][0-9]{0,2}(,[0-9]{3}){0,2}))$'; if (preg_match("/$pattern/", $oneline_buffer, $matches)){ としているのですが、 なぜかpreg_matchにひっかかりません。 (preg_match の直前の行を通っていることは、確認済みです) どなたか、お助け願えれば幸いです。

    • ベストアンサー
    • PHP
  • 正規表現で記号 & アンドの検索ってサポートされてない?

    preg_matchあるいはereg関数を用いて、 &p=XX (XXは半角数字2桁)のようなパラメーターがURLに含まれるかを調べたいのですが、p=XXまではうまくいくのですが、&p=XXだと マッチしなくなります。 $url = "http://hogehoge.jp/index.php&p=01"; $pattern = "&p=[0-9]{2}"; if (preg_match($pattern, $url)) { echo "ある"; } else { echo "ない"; } ご指導のほど宜しくお願いします。

    • ベストアンサー
    • PHP
  • 不要な配列を消したい

    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
  • PHPの正規表現「preg_match」で漢字を含む場合のマッチパター

    PHPの正規表現「preg_match」で漢字を含む場合のマッチパターンについて 宜しくお願い致します。 preg_matchを使っての正規表現で、「あいうえおかきくけこ3月10日さしすせそ」という文字列から「3月10日」だけを抽出するには、どういうパターンが良いのでしょうか? 下記の様にやってみましたが、だめでした。。。 preg_match("/\d{1,2}[月]\d{1,2}[日]/",$hoge,$match) これではうまくいきません。 どなたかお助けくださいー!

    • ベストアンサー
    • PHP
  • 正規表現について

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • PHP preg_match_all関数の配列をMysqlに格納したい

    PHP preg_match_all関数の配列をMysqlに格納したい PHP初心者です。 preg_march_all関数を使って正規表現でマッチングする練習を行っています。 preg_march_allを使った場合、マッチングした結果が多次元配列となって出力されると思うのですが、それらをそれぞれのレコードに分けてMysqlに格納したいと思っています。 php入門サイトのものを弄って作ったのですが、 while (! feof($fp)) { $s = fgets($fp); $n = preg_match_all($Pattern, $s, $ar, PREG_SET_ORDER); for ($i = 0; $i < $n; $i++) mysql_query("insert into seikihyougen1 (benri) value ('$ar[$i][2]')"); } 結果はマッチングした数のレコード分、benriカラムにArray[2]という文字列が入力されてしまいます。 これらをマッチングした文字列に直してMysqlに入れるにはどうすればよいのでしょうか?

    • ベストアンサー
    • PHP
  • 【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
  • 全角カタカナの正規表現

    if (preg_match('/[ァ-ヶー]+/', $value, $match )) { print ("$value"."はカタカナです。"."($match[0])"."<br />") } else { print ("$value"."はカタカナではない。<br />"); } という感じで全角カタカナにマッチさせる正規表現を使いたいのですが、このやり方だと「全角カタカナを含んでいる…」という表現になってしまいます。ある文字列が「すべて全角カタカナである」という正規表現を考えているのですが、なかなかうまくいきません。逆引きのサンプルなんかでもなかなか見つからなくて困っています。  同様に「すべて平仮名にマッチ!」というのにも応用できると思うのですが、なかなかうまく行きません。  是非、そのやり方やヒントをおしえてください。  マルチバイト対応なので[ぁ-ん]のような形で表記できます。またPerl互換(preg_match)で作っているので、Perlに詳しい方も是非是非おしえてください。

    • ベストアンサー
    • PHP
  • switchの大量分岐の高速化

    いつもお世話になっております。 phpにて、文中にキーワードがあるかどうか判定し、そのキーワードによって処理を変えていくというプログラムを作成しています。 preg_matchまたはstrposによるキーワード判定と、switchによる処理を組み合わせたものです。 //判定対象となる文章 $text = "判定対象となる文章"; //判定キーワードの設定 $word1 = "/キーワード1|きーわーど1|keyword1/"; $word2 = "/キーワード2|きーわーど2|keyword2/"; . .(中略) . $word30 = "/キーワード30|きーわーど30|keyword30/"; //判定処理 switch (true) { case preg_match($word1, $text): echo "キーワード1に該当します" break; case preg_match($word2, $text): echo "キーワード2に該当します" break; . .(大量のcase) . case preg_match($word30, $text) && preg_match($word1, $text): echo "キーワード1かつキーワード30に該当します" break; }; ざっと書くとこのような構造になっています。 しかしキーワード分岐がかなり多岐に渡っている状態で、switch文の後半のcaseに該当する場合になってくると速度もかなり遅く感じます。 どうにかもう少し高速化したいなあと考えているのですが、何か良い方法はありますでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう