Проблема в перекрытии, вы хотите сопоставить 'ab' и 'bc', что вы не сможете сделать с помощью простого регулярного выражения Однако учтите следующее.
Вы можете разделить каждый символ одной из следующих строк:
preg_match_all('/./', 'abc', $matches);
str_split('abc');
Даю вам: массив ('a', 'b', 'c').
И следующее разделит пары символов с оставшимся одним символом:
preg_match_all('/.{2}|./', 'abc', $matches);
Даю вам: массив ('ab', 'c');
Так что вы можете поиграть с комбинациями / вариациями, чтобы достичь своего результата.