人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: k27w
●カテゴリ:ウェブ制作
✍キーワード:echo PHP はと キーワード パターン
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kopj
●5ポイント

今日と天気のANDです。

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

◎質問者からの返答

希望通り出来ました。

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


2 ● makeworld
●5ポイント

正規表現で、ある文字列を含まない表現は難解になるので、個別にマッチして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; // '今日'と'天気'を含み、'良い'を含まない。
}

?>
◎質問者からの返答

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

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


3 ● GoldenDawn
●100ポイント ベストアンサー

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]) ? // 含むべきでないキーワードは入っていないか
 'よし' : 'だめ' ;
◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ