2015-11-09 4 views
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

К сожалению Im спутать - Можете ли вы выписать несколько примеров образца текста, а также то, что вы хотели бы, чтобы соответствовать? ... Мне нужно увидеть больше входов и выходов образца, прежде чем я смогу помочь – Nefariis

ответ

1

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

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

RegEx Demo

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

+0

, если есть способ сделать это, используя только preg_match? Благодарю. – yceruto

+0

с использованием 'preg_match_all' результат многомерен, а значение' min' и 'max' в массиве будет меняться в зависимости от их позиции в строке. Я объясняю? – yceruto

+0

если это невозможно, используйте 'preg_match' только, в любом случае спасибо. – yceruto

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 demo

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

Ideone demo:

$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 = 
Смежные вопросы