在php中检测字符串中的字母组合

Detecting combination of letters in string in php

提问人:baron_bartek 提问时间:11/13/2023 最后编辑:baron_bartek 更新时间:11/13/2023 访问量:43

问:

我有一个不短的刺痛,实际上是标志/参数的集合(从产品循环生成,但这并不重要)。

说:

aaaaaaaoooooreioopppdffdssds
yxxxsasadddddaaaaddaadadadad
oppppppassaaaaawwwwwww

等等。

我需要检测在这个较长的字符串中是否有某些标志的组合。

例如:

aaaaa (5* letter a)
xyy (1*x + 2*y)
opp (1*o + 2*pp)

基本上,如果较长的刺包含 5 个字母“a”,那么陈述应该是正确的。如果只有这样的情况(包含子字符串),那将非常容易。但问题是 5 个“a”字母可以完全彼此断开,就像(这只是一个例子。可以有非常多的必需标志组合)。yyyyaaaaaaxxxxaaaaayayaxayataya

我的猜测是preg_match能做到——有人能告诉我怎么做吗?

php 搜索 子字符串

评论

1赞 CBroe 11/13/2023
因此,与其寻找“组合”,不如将其改写为您需要寻找特定字母的一定次数?正则表达式本身并不适合完成这项工作 - 但是如果您替换任何使用正则表达式的内容,然后检查结果字符串的长度......?a
0赞 baron_bartek 11/13/2023
是的,它可以这样表述,但替换所有不匹配的内容只会完成搜索 5*a 次的工作。它不会为 or(或任何其他组合,因为这是未来的变化,明天它可以是 artufxkwuzjzuy),我需要一个返回 true/false 的函数。axyyopp
0赞 shingo 11/13/2023
所以意味着字符串必须包含 5 秒?但这意味着什么?字符串必须包含 1 和 2 秒?顺序重要吗?aaaaaaxyyxy
0赞 baron_bartek 11/13/2023
顺序不重要意味着较长的字符串必须包含一个字母和 2 个字母xyyxyy

答:

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