PHP:正则表达式,必须包含列表

时间:2016-11-21 05:43:40

标签: php regex preg-match

有谁知道如何编写正则表达式模式,这样做:

让我说我有数组中的字母,如

$letters = array('a','b','a');

我们也有一个单词Alabama,我希望preg_match返回true,因为它包含字母A两次和B.但它应该在单词Ab上返回false,因为该单词中没有两个A.

有什么想法吗?

编辑:我尝试的唯一模式是[a,b,a],但它会在包含其中一个字母的每个单词上返回true,并且不会检查多个字母出现的单词

2 个答案:

答案 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;
}