4

嗨,我试图在一个字符串中找到所有重叠的子字符串,这是我的代码,它唯一找到不重复的 ACA。

$haystack = "ACAAGACACATGCCACATTGTCC";
$needle = "ACA";
echo preg_match_all("/$needle/", $haystack, $matches);
4

2 回答 2

3

echo用于打印的返回值preg_match_all。也就是说,您只显示找到的匹配数。你可能想要做的是这样的print_r($matches);,像这样:

$haystack = "ACAAGACACATGCCACATTGTCC";
$needle = "ACA";
preg_match_all("/$needle/", $haystack, $matches);
print_r($matches);

输出:

Array
(
    [0] => Array
        (
            [0] => ACA
            [1] => ACA
            [2] => ACA
        )

)

演示

如果您真正关心的是它只计算ACACA一次,那么需要说明三件事:

  1. 使用正则表达式,这基本上是不可避免的。
  2. 你真的不应该计算两次,因为它是重叠的。这不是模式的真正重现。
  3. 也就是说,如果你想计算两次,你可以这样做:

    echo preg_match_all("/(?=$needle)/", $haystack, $matches);
    

    输出:

    4
    

    演示

于 2017-03-15T02:28:05.190 回答
0

这里有一个脚本来查找子字符串的所有出现,以及重叠的。

    $haystack = "ACAAGACACATGCCACATTGTCC";
    $needle   = "ACA";

    $positions    = [];
    $needle_len   = strlen($needle);
    $haystack_len = strlen($haystack);

    for ($i = 0; $i <= $haystack_len; $i++) {
        if( substr(substr($haystack,$i),0,$needle_len) == $needle){
            $positions[]=$i;
        }
    }
    print_r($positions);

输出:Array ( 0, 5, 7, 14 )

于 2022-02-08T17:28:20.060 回答