0

次のように preg_match を使用しています。

ケース 1: パターンには 2 つの単語があります。preg-match ソリューションを使用すると、2 つの結果が返されます。

ケース 2: パターンには 3 つの単語があります。preg-match ソリューションを使用すると、2 つの結果が返されます。

私の意見では、ケース 2 は 1 つの結果のみを返します。しかし、私は何のアプローチもしていません。

私は否定で試しました-パターンもそうです

$pattern="^(^Jim|^goes|^with)"; ) 

また

$pattern="(Jim|goes|with){1}" 

うまくいかなかったり

$pattern="(Jim){1}(with){1}"

うまくいかない

説明のために:

$pattern1="(Jim|goes|with)";
$_search[0]="Jim Carrey goes crazy";
$_search[1]="Jim Carrey goes crazy with santa clause";

preg_match("/$pattern1/is",$_search[0] )
preg_match("/$pattern1/is",$_search[1] )

私の例で 1 つの結果のパターンとして and を取得することは可能ですか?

ありがとう - 私はそれを願っています

編集: 入力(i) - 出力(o) 例(e)

e1 i: (Jim){1}(goes){1}(with){1}
e1 o: no result

e2 i: (Jim|goes|with)
e2 o: two matches  "Jim Carrey goes crazy" and "Jim Carrey goes crazy with santa clause"


e3 i: ^(^Jim|^goes|^with)
e3 o: two matches  "Jim Carrey goes crazy" and "Jim Carrey goes crazy with santa clause"

1 つの結果が得られる入力ソリューションはどれですか?

入力を伴うどのソリューション: 「ジムが行く」は、たとえば、「ジム・キャリーがサンタ句に夢中になる」という 1 つの結果を生成します。これは、正規表現の and 条件を意味しますが、可能ですか?

解決:

 $patternsearch=chop("Jim goes with  ");

 if(preg_match('/ /',$patternsearch)){
 $_array_pattern = explode( ' ', $patternsearch );
 $text = preg_replace('/ /','|',$patternsearch); 
 $pattern1=''.'('.$text.')';
 }else
 {
 $pattern1 = $patternsearch;
 }

 echo "my search is as follow: $patternsearch"."</br>";
 echo "my pattern is as follow: $pattern1"."</br></br>";


foreach($_search as $search){

$andcounter= preg_match_all("/$pattern1/isx", $search,$matscha);

echo "preg_match count:  $andcounter =";
echo "search count :  ".count($_array_pattern)."</br></br>";

if(count($_array_pattern) === $andcounter ){

$item[]=$search;

}



} 
echo "<pre>";
var_dump($item);
echo "</pre>" ;

出力:

私の検索は次のとおりです。ジムは一緒に行きます

私のパターンは次のとおりです: (Jim|goes|with)

preg_match カウント: 2 = 検索カウント: 3

preg_match カウント: 3 = 検索カウント: 3

array(1) {
   [0] =>
   string(39) "Jim Carrey goes crazy with santa clause"
}

そして:

     $patternsearch="Jim goes  ";

私の検索は次のとおりです。ジムは行く

私のパターンは次のとおりです: (Jim|goes)

preg_match カウント: 2 = 検索カウント: 2

preg_match カウント: 2 = 検索カウント: 2

array(2) {
   [0] =>
   string(21) "Jim Carrey goes crazy"
   [1] =>
   string(39) "Jim Carrey goes crazy with santa clause"
}
4

3 に答える 3

0

ここでは、正規表現の使用方法について少し混乱していると思います。を使用する/Jim|goes|with/と、、、、のいずれかを含む任意の文字列に一致することを意味Jimgoesますwith。正規表現も括弧で囲むと、つまり/(Jim|goes|with)/、一致もキャプチャされます。Jimここで、一致させたい文の両方に と がgoesあるため、常に正の一致が得られます。

Jimここで、「goes」と「with」のすべての単語を含む文に対して肯定的な一致が必要な場合は、次のようなものが必要です。

/\bJim\b.*?\bgoes\b.*?\bwith/

ここで、'\b' は単語の境界を意味し、"Jimmy"、"mangoes"、または "without" などとの誤った一致を回避します。.多かれ少なかれ「任意の文字」を意味し (改行に関連する微妙な点があります) *?、消極的です。ここでよく説明されている量指定子貪欲 vs. 消極的 vs. 所有量指定子。

非常に基本的な情報については、少なくともここ ( http://en.wikipedia.org/wiki/Regular_expression ) を参照することを強くお勧めします。

于 2013-09-12T08:21:10.793 に答える
0

ねえ、

$pattern="(Jim|goes|with)"; でpreg_match_all ( http://php.net/manual/en/function.preg-match-all.php ) を使用することについて

preg_match_all("/$pattern/is", $_search[0] ) // return 2
preg_match_all("/$pattern/is", $_search[1] ) // return 3
于 2013-09-12T08:00:08.020 に答える