Не совсем уверен, что вы подразумеваете под «расширением».В любом случае, вот как я бы это сделал с explode
и range
:
$input = '1-3,5,7-9';
$output = array();
foreach (explode(',', $input) as $nums) {
if (strpos($nums, '-') !== false) {
list($from, $to) = explode('-', $nums);
$output = array_merge($output, range($from, $to));
} else {
$output[] = $nums;
}
}
Если есть лучший способ, который не использует eval
(или модификатор PCRE e
), я ничего не знаю.
Вот, для вашего развлечения , однострочник (который, к сожалению, использует eval
), который возвращаеттот же результат, но ...
Отказ от ответственности : использование eval
не рекомендуется в большинстве случаев, поскольку это может создать угрозы безопасности и другие проблемы. Я бы не использовал это , но это все еще возможно.
С учетом сказанного, вот оно:
$output = explode(',', preg_replace('/([0-9]*)-([0-9]*)/e', 'implode(",", range($1, $2));', $input));