有谁知道如何编写正则表达式模式,这样做:
让我说我有数组中的字母,如
$letters = array('a','b','a');
我们也有一个单词Alabama,我希望preg_match返回true,因为它包含字母A两次和B.但它应该在单词Ab上返回false,因为该单词中没有两个A.
有什么想法吗?
编辑:我尝试的唯一模式是[a,b,a],但它会在包含其中一个字母的每个单词上返回true,并且不会检查多个字母出现的单词
答案 0 :(得分:1)
我认为你不必过度复杂化这个过程。您可以遍历letters
并检查word
中是否存在,如果所有字母都存在,则返回true
。像这样:
$letters = array('a','b','a');
$word = "Alabama";
function inWord($l,$w){
//For each letter
foreach($l as $letter){
//check if the letter is in the word
if(($p = stripos($w,$letter)) === FALSE)
//if false, return false
return FALSE;
else
//if the letter is there, remove it and move to the next one
$w = substr_replace($w,'',$p,1);
}
//If it found all the letters, return true
return TRUE;
}
并使用它:inWord($letters,$word);
请注意,这是不区分大小写的,如果您需要区分大小写,请stripos
替换strpos
答案 1 :(得分:0)
您是否需要使用正则表达式?即使问题可以通过它们解决,代码也会非常复杂。 "手动"解决方案将更清晰,需要线性时间:
function stringContainsAllCharacters(string $str, array $chars): bool
{
$actualCharCounts = array_count_values(str_split($str));
$requiredCharCounts = array_count_values($chars);
foreach ($requiredCharCounts as $char => $count) {
if (!array_key_exists($char, $actualCharCounts) || $actualCharCounts[$char] < $count) {
return false;
}
}
return true;
}