首页 > 解决方案 > 如何使用数组中的 preg_grep 查找仅/更多指定字母的单词?

问题描述

我有用于从具有指定字母的数组中搜索单词的示例函数:

public static function getWords($words, $specifed_letters) 
{ 
    $pattern = is_array($specifed_letters) ? '/[' . implode("", 
    $specifed_letters) . ']/u' : '/[' .$specifed_letters. ']/u';
    $result = preg_grep($pattern, $array_words);
    return $result;
}

示例用法:

$words = ["apple", "sample", "app", "тоҷик", "отабек", "баҳодурбек"];
$result = getWords($words, $letters = ['l', 's']);

此示例将返回单词:apple, sample. 因为在这个词中有字母"l""s"

如何搜索单词中包含所有指定字母的单词?

例如,如果我添加到指定的字母"app",那么来自 words 数组的必须是 return words: app, apple

以及如何仅使用指定字母搜索单词。例如我会写 word变"app"体。以及我如何才能在没有结果的情况下获得结果?shuffled"pap""app" "apple"

标签: phpregexpreg-grep

解决方案


您可以将单词字符拆分为一个数组并循环它们,并将指定字符串中的字符拆分为一个数组。

如果某个单词字符出现在指定字符串数组的字符中,则从两个数组中删除该字符。

循环完成后,验证指定字符串数组的字符中是否没有更多字符。

$words = ["apple", "sample", "app", "justappgg", "тоҷик", "отабек", "баҳодурбек", "APELCIN", "API", "pap"];
mb_internal_encoding("UTF-8");

foreach ($words as $word) {
    $wordSplit = preg_split('//u', $word, null, PREG_SPLIT_NO_EMPTY);
    $strSplit = preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
    $wordSplit = array_filter($wordSplit, function ($x) use (&$strSplit) {
        if (in_array(strtolower($x), array_map('strtolower', $strSplit), true)) {
            $pos = array_search(strtolower($x), array_map('strtolower', $strSplit), true);
            unset($strSplit[$pos]);
            return false;
        }
        return true;
    });
    if (count($strSplit) === 0) {
        echo "$word contains all letters of $str" . PHP_EOL;
    }
}

演示


推荐阅读