Почему бы не работать с str_replace
:
$str = str_repalce('||', '|*|', str_replace('||', '|*|', $str));
Редактировать Поскольку я понимаю, что понимаю, что вы ищете, есть три случая, когда могут возникать пробелы:
- в начале:
|foo|bar
→ *|foo|bar
- посередине:
foo||bar
→ foo|*|bar
- в конце:
foo|bar|
→ foo|bar|*
Последние два могут быть обработаны одновременно, но первый должен обрабатываться отдельно:
$str = preg_replace('/^\|/', '*|', preg_replace('/\|(?=\||$)/', '|*', $str))