我有一个一定不要短的刺,它们实际上是标志/参数的集合(从产品循环生成,但这并不重要)。
说:
aaaaaaaoooooreioopppdffdssds
yxxxsasadddddaaaaddaadadadad
oppppppassaaaaawwwwwww
等等。
我需要检测这个较长的字符串中是否存在某些标志的组合。
例如:
aaaaa (5* letter a)
xyy (1*x + 2*y)
opp (1*o + 2*pp)
基本上,如果较长的刺包含 5 个字母“a”,那么陈述应该是正确的。如果只有这样的情况
yyyyaaaaaaxxxx
(包含子字符串aaaaa
),那就真的很容易了。但问题是 5 个“a”字母可以像 yayaxayataya
一样彼此完全断开(这只是一个例子。可能有很多必需的标志组合)。
我的猜测是 preg_match 可以做到这一点 - 有人能告诉我怎么做吗?
如果您在可以仅使用正则表达式的环境中不需要它 - 那么我会选择
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
);
您想查看
<
还是 ==
的计数,由您决定。