2013-12-17 51 views
0

而在SO尝试一个问题,我试图写相匹配三个字符应该是这样的字符串中的正则表达式。正则表达式匹配三个特定的字符

我下面的答案Regular Expressions: Is there an AND operator?

<?php 

$words = "systematic,gear,synthesis,mysterious"; 
$words=explode(",",$words); 

$your_array = preg_grep("/^(^s|^m|^e)/", $words); 

print_r($your_array); 

?> 

输出应该是系统神秘。但我也越来越合成。

为什么是这样?我做错了什么?

**我不想一个新的解决方案:) SEE HERE

+0

我想你会得到'合成'主要是因为它开始于's'? –

+0

但正则表达式匹配的所有字符不是只需S –

+0

这是不正确的,正则表达式匹配,如果用这个词是's'开始,'M'或'e' –

回答

4

你可以这样做:

$wordlist = 'systematic,gear,synthesis,mysterious'; 
$words = explode(',', $wordlist); 

foreach($words as $word) { 
    if (preg_match('~(?=[^s]*s)(?=[^m]*m)(?=[^e]*e)~', $word)) 
     echo '<br/>' . $word; 
} 
//or 
$res = preg_grep('~(?=[^s]*s)(?=[^m]*m)(?=[^e]*e)~', $words); 
print_r($res); 

为了测试在字符串中的字符的存在,我用(?=[^s]*s)
[^s]*s表示所有不是“零”或更多次的“s”,以及“s”
(?=..)是一个超前的断言,意思是“紧随其后”。它只是一个检查,一个预见不会在匹配结果中给出字符,但是这个特性的主要兴趣是可以多次检查相同的子字符串。

你的模式有什么问题?

/^(^s|^m|^e)/只会给出以“s”或“m”或“e”开头的单词,因为^是一个锚点,意思是:“字符串的开始”。换句话说,您的模式与/^([sme])/相同。

+0

EHH,不错!!!!! – sergio

+1

问题是*为什么*而不是*如何* :) –

+0

casimir:我使用两个^和那不起作用 –