如何使用数组中的preg_grep查找只有/更多指定字母的单词?

时间:2018-05-22 12:10:00

标签: php regex 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",那么从单词数组必须返回单词:app, apple

如何搜索单词仅指定字母。例如,我将在"app"变体shuffled中写出"pap"字。我如何在没有 "app"的情况下只获得结果"apple"

2 个答案:

答案 0 :(得分:1)

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

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

完成循环后,请确认指定字符串数组中的字符中没有剩余字符。

$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;
    }
}

Demo

答案 1 :(得分:0)

您可以使用preg_grep。
如果你在正则表达式模式中内嵌[]内的字母,它应该查找该字母并返回该项目(如果找到)。

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

$res = preg_grep("/[" . implode("", $letters) . "]/", $words); // pattern = "/[ls]/"
var_dump($res);

https://3v4l.org/UZTYZ

修改
但是这部分问题是:以及如何只用指定的字母搜索单词。例如,我将在随机变量“pap”中写出“app”一词。如何在没有“苹果”的情况下获得结果只有单词“app”?
与第一部分完全相反,你想要一个非常宽松的搜索 你期待一个松散和一个精确的结果数组吗?

您可以通过拆分字符串并对字母进行排序(在数组中)来完成匹配 然后检查阵列是否相互匹配。如果他们这样做,那么它就完全匹配了。

$words = ["apple", "sample", "app", "тоҷик", "отабек", "баҳодурбек"]; 
$find = "pap";

$find = str_split($find);
sort($find);
foreach($words as $word){
    $temp = str_split($word);
    sort($temp);
    if($temp == $find){
        echo "match " . $word . "\n";
    }
}

https://3v4l.org/WbTUK