alexanderkx
@alexanderkx

Как сделать необязательное условие в регулярном выражении (preg_match)?

Приветствую.

Имеется такая регулярка:

preg_match('~^.*?(.*)' . preg_quote("*") . '(\\d+).*?$~', $str, $matches)


На выходе из строки вида 800*600 получаем 800 и 600 соответственно.
Однако, если будет работать с такой строкой: 255*200,5, то (,5) обрубается, и получаем 255 и 200.

Методом "в лоб" исправил выражение на такое:

preg_match('~^.*?(.*)' . preg_quote("*") . '(\d+\,\d+).*?$~', $str, $matches)


Но, теперь ситуация обратная. С целыми числами не работает, а дробные обрабатывает, как и требуется.

Можно конечно проверять предварительно на наличие запятой и действовать в зависимости от этого, но мне кажется можно решить этот вопрос и средствами модификации регулярки. Правда поиски не привели к результату.

Буду благодарен за подсказки.
Спасибо.
  • Вопрос задан
  • 732 просмотра
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
(\d++(?:,\d++)?)

~^.*?(.*)

Как, по вашему мнению, PCRE должен воспринимать эту часть регулярки? Что должно попасть в подмаску? Всё от начала строки до символа *? Зачем тогда ".*?" перед этим? Что-то другое?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы