如何在数组中使用 preg_grep 查找具有 only/more 指定字母的单词?
How to find words with only/more specified letters using preg_grep in array?
我有示例函数,用于从具有指定字母的数组中搜索单词:
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']);
此示例将 return 个单词:apple, sample
。
因为在这个词中有字母 "l"
或 "s"
.
如何搜索单词中包含 所有指定字母 的单词?
例如,如果我添加到指定的字母 "app"
,那么来自单词数组的单词必须是 return 个单词:app, apple
.
以及如何搜索 仅指定字母 的单词。例如,我将在 shuffled
变体 "pap"
中写词 "app"
。以及如何在没有 "apple"
?
的情况下获得仅结果字 "app"
您可以使用 preg_grep.
如果您在正则表达式模式中内爆 []
内的字母,它应该查找字母,如果找到 return 项目。
$words = ["apple", "sample", "app", "тоҷик", "отабек", "баҳодурбек"];
$letters = ['l', 's'];
$res = preg_grep("/[" . implode("", $letters) . "]/", $words); // pattern = "/[ls]/"
var_dump($res);
编辑
但是你问题的这一部分:以及如何只用指定的字母搜索单词。例如,我将在随机变体 "pap" 中写单词 "app"。以及如何在没有 "apple" 的情况下获得仅结果词 "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";
}
}
可以将单词字符拆分成数组循环,也可以将指定字符串中的字符拆分成数组
如果单词字符之一出现在指定字符串数组的字符中,则从两个数组中删除该字符。
循环完成后,验证指定字符串数组中的字符中是否没有剩余字符。
$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;
}
}
我有示例函数,用于从具有指定字母的数组中搜索单词:
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']);
此示例将 return 个单词:apple, sample
。
因为在这个词中有字母 "l"
或 "s"
.
如何搜索单词中包含 所有指定字母 的单词?
例如,如果我添加到指定的字母 "app"
,那么来自单词数组的单词必须是 return 个单词:app, apple
.
以及如何搜索 仅指定字母 的单词。例如,我将在 shuffled
变体 "pap"
中写词 "app"
。以及如何在没有 "apple"
?
"app"
您可以使用 preg_grep.
如果您在正则表达式模式中内爆 []
内的字母,它应该查找字母,如果找到 return 项目。
$words = ["apple", "sample", "app", "тоҷик", "отабек", "баҳодурбек"];
$letters = ['l', 's'];
$res = preg_grep("/[" . implode("", $letters) . "]/", $words); // pattern = "/[ls]/"
var_dump($res);
编辑
但是你问题的这一部分:以及如何只用指定的字母搜索单词。例如,我将在随机变体 "pap" 中写单词 "app"。以及如何在没有 "apple" 的情况下获得仅结果词 "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";
}
}
可以将单词字符拆分成数组循环,也可以将指定字符串中的字符拆分成数组
如果单词字符之一出现在指定字符串数组的字符中,则从两个数组中删除该字符。
循环完成后,验证指定字符串数组中的字符中是否没有剩余字符。
$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;
}
}