Я пытаюсь сопоставить такие типы строк (5 разных строк).
|n||0||0||0||0|
|n||n||0||0||0|
|n||n||n||0||0|
|n||n||n||n||0|
|n||n||n||n||n|
Где n - переменная, но другие нули - это константы, n также не может быть нулем.
Мне нужно получить такой результат, как я hardcoded с использованием альтернативного оператора https://regex101.com/r/vE9hL4/1
Мне нужно захватить все числа внутри '| |" как в моем регулярном выражении. Пожалуйста, помогите упростить его.
Во-первых, я бы сделал сопоставление; одно или несколько положительных чисел, заключенных в символы трубопровода, необязательно сопровождаемые нулями, заключенными в символы трубопровода.
$subject = '|12||13||56||1||0|';
$re = '/^((?:\|[1-9]\d*\|)+)(?:\|0\|)*$/';
Если он совпадает, вы можете сделать разбивку на основе самих символов трубы:
if (preg_match_all($re, $subject, $matches)) {
$numbers = preg_split('/\|/', $matches[1][0], -1, PREG_SPLIT_NO_EMPTY);
}
извините, не прочитал часть вопроса, вот мой пересмотренный ответ...
^\|([0-9]*)\|(?:\|(0)\|\|(0)\|\|(0)\|\|(0)\||(?:\|([1-9]*)\|\|(0)\|\|(0)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|(0)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|)|)$