PHPの正規表現で、対象文字列に複数の文字が存在するか調べたいと思います。


$text = '今日はとても良い天気です。';// 対象文字列
$pat = '/今日|天気/';// 調べるキーワード
if(preg_match($pat,$text)){
echo 1; // 正しい場合は1が表示される
}

上記の場合、対象文字列に"今日"または"天気"が入っているので、1が表示されます。
では、"今日"と"天気"が入っている(AND)を調べたかったので
$pat = '/今日&天気/';
としたのですが、1が表示されません。

どういう書き方をすればいいか教えて下さい。

また、併せて「"今日"と"天気"は入っているが"良い"は入っていない」というパターンの書き方もあれば教えて下さい。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/10 15:00:44
  • 終了:2010/03/12 23:01:17

ベストアンサー

id:GoldenDawn No.3

GoldenDawn回答回数426ベストアンサー獲得回数812010/03/11 18:21:01

ポイント100pt

preg_match_all で検出されるキーワードのを数えてみました。

<?php
$text = '今日はとても良い天気の天気です。' ; // 対象文字列
$pat = '/今日|天気/' ;                    // 調べるキーワード

preg_match_all($pat, $text, $m) ;
// マッチしたキーワードを数える
echo count(array_unique($m[0])) == 2 ? 'よし' : 'だめ' ;
<?php
$text = '今日はとても良い天気です。' ; // 対象文字列
//$text = '今日はとても悪い天気です。' ; // 対象文字列
$patIN = '今日|天気' ;
$patEX = '良い' ;
preg_match_all("/$patIN|$patEX/", $text, $m) ;
echo count(array_unique($m[0])) == 2 // 含むべきキーワードの数
     && !in_array($patEX, $m[0]) ?   // 含むべきでないキーワードは入っていないか
     'よし' : 'だめ' ;
id:k27w

おお、これは凄いです。特に後半のcountとin_arrayを組み合わせる方法は始めて知りました。

とても参考になりました。ありがとうございます。

2010/03/12 23:00:45

その他の回答(2件)

id:kopj No.1

kopj回答回数123ベストアンサー獲得回数62010/03/10 15:40:46

ポイント5pt

今日と天気のANDです。

.*今日.*天気.*|.*天気.*今日.*

id:k27w

希望通り出来ました。

ただ、キーワードを逆にした物を2つ用意するという書き方で良いのか、いまいち効率的でないようにも感じます。他の方の回答も参考にしたいと思います。

2010/03/10 17:16:11
id:makeworld No.2

makeworld回答回数75ベストアンサー獲得回数232010/03/10 19:40:07

ポイント5pt

正規表現で、ある文字列を含まない表現は難解になるので、個別にマッチしてif文で判定した方が簡単だと思います。

文字列を含まないという正規表現は? - 教えて!goo

ソースの文字コードはutf-8で保存してください。

<?php

//$text='今日はとても良い天気です。';
$text='今日は天気です。';
$pat1='/今日/u';
$pat2='/天気/u';
$pat3='/良い/u';
$pat4='/今日.*天気|天気.*今日/u';
$pat5='/^(([^良今]|良+[^良い])*良*今日([^良天]|良+[^良い])*良*天気([^良]|良+[^良い])*良*)|(([^良天]|良+[^良い])*良*天気([^良今]|良+[^良い])*良*今日([^良]|良+[^良い])*良*)$/u';

$m1 = preg_match($pat1, $text);
$m2 = preg_match($pat2, $text);
$m3 = preg_match($pat3, $text);
$m4 = preg_match($pat4, $text);
$m5 = preg_match($pat5, $text);

if($m1 && $m2) {
  echo 1; // '今日'と'天気'を含む。
}
if($m1 && $m2 && !$m3) {
  echo 2; // '今日'と'天気'を含み、'良い'を含まない。
}

if($m4) {
  echo 3; // '今日'と'天気'を含む。
}
if($m5) {
  echo 4; // '今日'と'天気'を含み、'良い'を含まない。
}

?>
id:k27w

かなり長文になるんですね・・・。

「こうしないと出来ない」というならそれで納得しますが、なんか他にも書き方がある気がしますので、質問終了まで回答を募集してみます。

2010/03/11 14:53:09
id:GoldenDawn No.3

GoldenDawn回答回数426ベストアンサー獲得回数812010/03/11 18:21:01ここでベストアンサー

ポイント100pt

preg_match_all で検出されるキーワードのを数えてみました。

<?php
$text = '今日はとても良い天気の天気です。' ; // 対象文字列
$pat = '/今日|天気/' ;                    // 調べるキーワード

preg_match_all($pat, $text, $m) ;
// マッチしたキーワードを数える
echo count(array_unique($m[0])) == 2 ? 'よし' : 'だめ' ;
<?php
$text = '今日はとても良い天気です。' ; // 対象文字列
//$text = '今日はとても悪い天気です。' ; // 対象文字列
$patIN = '今日|天気' ;
$patEX = '良い' ;
preg_match_all("/$patIN|$patEX/", $text, $m) ;
echo count(array_unique($m[0])) == 2 // 含むべきキーワードの数
     && !in_array($patEX, $m[0]) ?   // 含むべきでないキーワードは入っていないか
     'よし' : 'だめ' ;
id:k27w

おお、これは凄いです。特に後半のcountとin_arrayを組み合わせる方法は始めて知りました。

とても参考になりました。ありがとうございます。

2010/03/12 23:00:45

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • MovableTypeのあれこれ MovableTypeをめっちゃ久しぶりに触ってるんだけど、動的生成できるとかPHP使えるとか全然知らなかった… 使用中プラグイン 小粋空間: Split プラグイン More Custom Fields | Plug
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません