Найти все подстроки в строке с перекрытием
Привет я пытаюсь найти все перекрывающиеся подстроки в строке, вот мой код его единственное нахождение неповторяющихся ACA.
$haystack = "ACAAGACACATGCCACATTGTCC";
$needle = "ACA";
echo preg_match_all("/$needle/", $haystack, $matches);
2 ответа
Решение
Вы используете 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
только один раз, ну, есть три вещи, которые нужно сказать об этом:
- Это в основном неизбежно с регулярным выражением.
- Вы действительно не должны считать это дважды, потому что это частично совпадает. Это не реальное повторение шаблона.
Тем не менее, если вы хотите посчитать это дважды, вы можете сделать это примерно так:
echo preg_match_all("/(?=$needle)/", $haystack, $matches);
Выход:
4
Вот скрипт для поиска всех вхождений подстроки, а также перекрывающихся.
$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 )