Regex для разделения размеров одежды - PullRequest
1 голос
/ 02 февраля 2020

У меня есть следующий ввод (только, например, реальный ввод содержит гораздо больше сумасшедших данных)

$values = [
    '32/34, 36/38, 40/42, 44/46',
    '40/42/44/46/48',
    '58/60',
    '39-42',
    '40-50-60',
    '24-25,26,28,30',
    '36 40,5 44',
];

и я хочу разделить его на разделители, такие как / или ,, но сохранить пары значений , Это должно быть сделано только в том случае, если разделитель не встречается несколько раз, поэтому результат должен выглядеть следующим образом:

'32/34, 36/38, 40/42, 44/46'
    => [ '32/34', '36/38', '40/42', '44/46' ]
'40/42/44/46/48'
    => [ '40', '42', '44', '46', '48' ]
'58/60'
    => [ '58/60' ]
'39-42'
    => [ '39-42' ]
'40-50-60'
    => [ '40', '50', '60' ]
'24-25,26,28,30'
    => [ '24-25', '26', '28', '30' ]
'36 40,5 44'
    => [ '36', '40,5', '44' ]

То, что у меня есть, это

$separator = '^|$|[\s,\/-]';
$decimals = '\d+(?:[,.][05])?';
foreach ($values as $value) {
    preg_match_all('/' .
        '(?<=' . $separator . ')' .
        '(?:' .
            '(?P<var1>(' . $decimals . ')[\/-](?-1)|(?-1))' .
        ')(?=' . $separator . ')' .
    '/ui', $value, $matches);
    print_r($matches);
}

Но это не удается для 40/42/44/46/48, который возвращает

[var1] => Array
    (
        [0] => 40/42
        [1] => 44/46
        [2] => 48
    )

Но каждое число должно быть возвращено отдельно. Изменение регулярного выражения в '(?P<var1>(' . $decimals . ')([\/-])(?-2)|(?-2))(?!\3)' лучше, но все равно возвращает неправильный результат

[var1] => Array
    (
        [0] => 40
        [1] => 42
        [2] => 44
        [3] => 46/48
    )

Как должно выглядеть правильное регулярное выражение?

...