проблема порядка соответствия регулярного выражения

1

У меня есть следующий код:

preg_match(
    '/(,\s?min\s?(?P<min>[\d]+)\s?)?(,\s?max\s?(?P<max>[\d]+)\s?)?/', 
    ',max 1, min 2', 
    $vars
);

Итак, результат сопоставления:

//var_dump($vars):

array (size=7)
  0 => string ',max 1' (length=6)
  1 => string '' (length=0)
  'min' => string '' (length=0)
  2 => string '' (length=0)
  3 => string ',max 1' (length=6)
  'max' => string '1' (length=1)
  4 => string '1' (length=1)

Как можно оценить значение min оно пустое ''.

Мне нужна помощь, чтобы получить значение данных min и max независимо от порядка, который они отображают в строке.

Благодарю.

  • 2
    Извините, я в замешательстве. Можете ли вы написать несколько примеров текста, а также то, что вы хотите сопоставить? ... Мне нужно увидеть больше примеров входов и выходов, прежде чем я смогу помочь
Теги:

2 ответа

1
Лучший ответ

Чтобы захватить min и max независимо от их порядка, вы можете использовать это регулярное выражение с чередованием:

\b(?:min\h+\K(?<min>\d+)|max\h+\K(?<max>\d+))\b

Демо-версия RegEx

Используйте захваченные имена групп min и max для извлечения значения из результирующего массива после вызова функции preg_match_all.

  • 0
    Есть ли способ сделать это, используя только preg_match? Благодарю.
  • 0
    при использовании preg_match_all результат будет многомерным, а значения min и max в массиве будут варьироваться в зависимости от их положения в строке. Я объясняю?
Показать ещё 4 комментария
1

Вы можете использовать следующее регулярное выражение:

(?J)(?:,\s?min\s?(?P<min>\d+)\s?)(?:,\s?max\s?(?P<max>\d+)\s?)?|(?:,\s?max\s?(?P<max>\d+)\s?)(?:,\s?min\s?(?P<min>\d+)\s?)?

См. Демо-версию regex

Регулярное выражение в основном ваше, я просто добавил модификатор (?J), который позволяет повторно использовать имена захвата в одном и том же регулярном выражении и добавил альтернативу с другим порядком min и max. Кроме того, я удалил квадратные скобки из \d.

Идеальная демонстрация:

$re = '/(?J)(?:,\s?min\s?(?P<min>\d+)\s?)(?:,\s?max\s?(?P<max>\d+)\s?)?|(?:,\s?max\s?(?P<max>\d+)\s?)(?:,\s?min\s?(?P<min>\d+)\s?)?/'; 
if (preg_match($re, ",max 1, min 2", $matches)){
    print_r($matches["max"] . " = max and min = " . $matches["min"] . PHP_EOL);
}
if (preg_match($re, ",min 5, max 6", $matches)){
    print_r($matches["max"] . " = max and min = " . $matches["min"] . PHP_EOL);
}
if (preg_match($re, ", min 7", $matches)){
    print_r($matches["max"] . " = max and min = " . $matches["min"] . PHP_EOL);
}
if (preg_match($re, ",max 8", $matches)){
    print_r($matches["max"] . " = max and min = " . $matches["min"]);
}

Результаты:

1 = max and min = 2
6 = max and min = 5
 = max and min = 7
8 = max and min = 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню