在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 :(得分: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])/
相同。