a* は 0 個以上の a を意味します。
文字列「abbabba」には、abba が 2 回出現しています。(abba)bba と abb(abba)。preg_match_all は、最初の出現のみに一致します。
正規表現の基本の基本が欠けていますか?
$string = 'abbabba';
preg_match_all("/ab*a/", $string, $matches);
print_r($matches);
Array ( [0] => Array ( [0] => abba ) )