0

我使用 preg_match 如下:

案例1:pattern有两个词。使用 preg-match 解决方案 - 它返回两个结果。

案例 2:pattern 有 3 个单词。使用 preg-match 解决方案 - 它返回两个结果。

在我看来,案例 2 只会返回一个结果。但我没有任何办法。

我尝试否定 - 模式也是如此

$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] )

在我的示例中,是否有可能获得一个结果的 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"

哪个输入解决方案带有一个结果?

哪个带有输入的解决方案:“Jim goes with”会生成一个结果,例如:“Jim Carrey got crazy with santa Clause”它表示正则表达式中的一个和条件 - 但有可能吗?

解决方案:

 $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 与

我的模式如下:(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

嘿,

将 preg_match_all ( http://php.net/manual/en/function.preg-match-all.php ) 与 $pattern="(Jim|goes|with)"; 一起使用怎么样?

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

我认为这里关于如何使用正则表达式有点混乱。如果您使用/Jim|goes|with/,则意味着您要匹配任何包含Jim, goes,的字符串with。如果您还用括号括起您的正则表达式,即/(Jim|goes|with)/您也捕获了匹配项。现在,由于您要匹配的两个句子都有Jimgoes,所以您总是有一个肯定匹配。

现在,如果您想对包含所有单词Jim'goes' 和 'with' 的句子进行肯定匹配,则需要类似以下内容:

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

其中 '\b' 表示单词边界,避免您与“Jimmy”、“mangoes”或“without”之类的错误匹配,.或多或少表示“任何字符”(与换行符相关的微妙之处)并且*?是不情愿的量词,这里很好地解释了贪婪与不情愿与占有量词

我强烈建议您至少在这里(http://en.wikipedia.org/wiki/Regular_expression)查看一些非常基本的信息。

于 2013-09-12T08:21:10.793 回答
0

我不完全确定我理解这个问题,但也许这就是你想要的:

$pattern = '(Jim)?.*(goes)?.*(crazy)?';
if (preg_match("/$pattern/is", $_search[0], $match)) {
    $num_matches = count(array_filter($match)) - 1;
}

array_filter将删除空匹配,当未找到可选字符串时会发生这种情况。然后我们从计数中减去 1,因为这$match[0]是整个正则表达式的匹配项,而您并不关心。

于 2013-09-12T08:24:45.300 回答