提问人:baron_bartek 提问时间:11/13/2023 最后编辑:baron_bartek 更新时间:11/13/2023 访问量:43
在php中检测字符串中的字母组合
Detecting combination of letters in string in php
问:
我有一个不短的刺痛,实际上是标志/参数的集合(从产品循环生成,但这并不重要)。
说:
aaaaaaaoooooreioopppdffdssds
yxxxsasadddddaaaaddaadadadad
oppppppassaaaaawwwwwww
等等。
我需要检测在这个较长的字符串中是否有某些标志的组合。
例如:
aaaaa (5* letter a)
xyy (1*x + 2*y)
opp (1*o + 2*pp)
基本上,如果较长的刺包含 5 个字母“a”,那么陈述应该是正确的。如果只有这样的情况(包含子字符串),那将非常容易。但问题是 5 个“a”字母可以完全彼此断开,就像(这只是一个例子。可以有非常多的必需标志组合)。yyyyaaaaaaxxxx
aaaaa
yayaxayataya
我的猜测是preg_match能做到——有人能告诉我怎么做吗?
答:
1赞
CBroe
11/13/2023
#1
如果你在只能使用正则表达式的环境中不需要它 - 那么我会选择
array_count_values(mb_str_split('aaaaaaaoooooreioopppdffdssds'));
这将为您提供每个字符的计数(多字节安全),因此您现在要做的就是检查生成的数组,是否有您要查找的该字符的条目,以及该计数是否等于(或更高,如果不排除)您要查找的字符。
如果是你需要找到哪些字符的“输入”——那么也应用相同的两个函数,那么你就会得到一个数组,它给你提供了你需要寻找的(最小)计数,所以你可以简单地循环它来执行你的测试。xyy
function checkLetters($letters, $teststring) {
$inputLetterCounts = array_count_values(mb_str_split($letters));
$letterCounts = array_count_values(mb_str_split($teststring));
foreach($inputLetterCounts as $inputLetter => $count) {
if(!isset($letterCounts[$inputLetter]) ||
$letterCounts[$inputLetter] < $count) {
return false;
}
}
return true;
}
var_dump(
checkLetters('xxy', 'aaaaaaoooooreioopppdffdssds'), // false
checkLetters('xxy', 'aaaaxaaoyooorexoopppdffdssds'), // true
);
是否要检查 的计数 或 ,由您决定 - 取决于是要允许字符出现更多次,还是只允许该特定数字出现。<
!=
评论
0赞
baron_bartek
11/13/2023
谢谢。不幸的是mb_str_split是一个 php7 函数,我仅限于 php5 :/在工作服务器上 - 我将寻找解决方法。
1赞
nice_dev
11/13/2023
@baron_bartek 只需改用即可。您不太可能使用多字节字符器作为产品相关内容的标志。str_split
评论
a
a
xyy
opp
aaaaa
a
xyy
x
y
xyy
x
yy