// Вот регулярка вашей мечты:
$pattern = '/^(?<prefix>\w+)|(?<names>\w+),(?<values>\w+)/i';
$value = 'string|name1,value1|name2,value2';
preg_match_all($pattern, $value, $matches);
var_dump($matches);
// Можно почистить лишние матчеры
array_walk($matches, function(&$item, $key) use (&$matches) {
if (is_numeric($key)) {
unset($matches[$key]);
return;
}
foreach ($item as $key => $match) {
if (empty($match)) {
unset($item[$key]);
}
}
});
var_dump($matches);