Попробуйте это регулярное выражение:
(.*?)\s*\((\d+)\)\s*-\s*(\d+\.\d+)(?:,\s*)?
Главное отличие в том, что у вас было .*
(жадный), который я заменил на .*?
(не жадный). Сначала вы «съели» всю строку (кроме разрывов строк), а затем проследили назад, чтобы соответствовать только одному куску из вашей строки.
Демо-версия:
preg_match_all('/(.*?)\s*\((\d+)\)\s*-\s*(\d+\.\d+)(?:,\s*)?/',
"E-Book What I Didn't Learn At School... (2) - 3525.01, FREE Intro DVD/Vid (1) - 0.15",
$matches, PREG_SET_ORDER);
print_r($matches);
производит:
Array
(
[0] => Array
(
[0] => E-Book What I Didn't Learn At School... (2) - 3525.01,
[1] => E-Book What I Didn't Learn At School...
[2] => 2
[3] => 3525.01
)
[1] => Array
(
[0] => FREE Intro DVD/Vid (1) - 0.15
[1] => FREE Intro DVD/Vid
[2] => 1
[3] => 0.15
)
)