当前位置: 首页 > 知识库问答 >
问题:

PHP:Regex,必须包含列表中的所有字母

严宏朗
2023-03-14

有人知道如何编写正则表达式模式吗?

假设我有一组字母,比如

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

还有一个单词Alabama,我希望preg_match返回true,因为它包含两次字母a和B。但是单词Ab应该返回false,因为这个单词中没有两个a。

有什么想法吗?

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

共有2个答案

亢保赫
2023-03-14

你必须使用正则表达式吗?即使问题可以通过它们解决,代码也会非常复杂。“手动”解决方案将更清晰,并且需要线性时间:

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;
}
杜俊晤
2023-03-14

我认为您不必使过程过于复杂。您可以遍历字母并检查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)

请注意,这是不区分大小写的,如果需要,请将其替换为区分大小写的striposbystrpos

 类似资料:
  • 我们正试图在我们公司建立我们自己的表单-字段-组件。我们试图这样包装材料设计的组成部分: 字段: 文本框: 用法: 这大致会导致以下结果: 但是我在控制台中得到“mat-form-field必须包含一个MatFormFieldControl”。我想这与不直接包含matInput-field的mat-form-field有关。但它包含它,它只是在ng内容投影中。 这是一场闪电战:https://st

  • null null null 我只是不知道如何将两者结合起来,这样小数点后才是强制性的。 我如何解决这个问题?

  • 我正在处理Angular表单,我试图验证一个反应性表单。对于模板,我在项目中使用材料设计, 我在文本框中输入条件ngIf进行验证时出错 错误是-: ERROR错误:mat-form-field必须包含一个MatFormFieldControl。 请看-: 为了消除这个问题,我已经在文件2中导入了module.ts的MatInputMoules。已添加您必须将matInput添加到输入 但还是出现了

  • 我试图检查String arrayList中的某个字符串是否包含Character arrayList中的所有字符。 这就是我目前正在尝试的: 这是我运行程序时遇到的错误: 错误来自这一行: 如果有人对如何解决这个问题有任何建议,我将不胜感激!

  • 我使用的是android(SQL)中的Room database,我有一个表,它将日期作为一列存储为2000-01-31格式的字符串。我想获得表中的所有条目,根据它们各自的月份。我想用 但这样,我将不得不为每个月编写单独的查询。我想获得的条目按月,并显示在我的android应用程序。