2014-10-12 1 views
1

я разбить строку «3 (1-5)», как это:разделить строку, состоящую десятичные вместо целого

$pattern = '/^(\d+)\((\d+)\-(\d+)\)$/'; 
preg_match($pattern, $string, $matches); 

Но мне нужно сделать то же самое для знаков после запятой, то есть «3.5 (1.5 -4,5). И что мне делать, если пользователь пишет «3,5 (1,5-4,5)»?

Выход '3,5 (1,5-4,5)' должно быть:

$matches[1] = 3.5 
$matches[2] = 1.5 
$matches[3] = 4.5 
+0

Вы понимаете регулярное выражение вы используете? – kero

+0

'(. +?) \ ((. +?) - (. +?) \)' ... \ d только цифра [0-9] не десятичная. – Frogmouth

ответ

7

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

$pattern = '/^(\d+(?:[.,]\d+)?)\(((?1))-((?1))\)$/'; 

Первая группа записи (...) соответствует следующей схеме:

(   # group and capture to \1: 
    \d+  # digits (0-9) (1 or more times) 
    (?:  # group, but do not capture (optional): 
    [.,] #  any character of: '.', ',' 
    \d+  #  digits (0-9) (1 or more times) 
)?  # end of grouping 
)   # end of \1 

послесловия мы ищем открывающую скобку, а затем рекурсия (матча/захват) 1-й подшаблон затем дефис (-), а затем повторить (матч/захват) 1-й подшаблон с последующей закрывающей скобкой.

Code Demo

+2

'? 1' nice ....... – vks

+0

Каким образом мне нужно изменить шаблон, если я хочу совместить строку' 3.5 (2.5-5.5) [10.5] '? В этом примере '10.5' должно быть' matches [3] ' – user3142695

+0

Большое спасибо за помощь – user3142695

-1

Эта модель должна помочь:

^(\d+\.?\,?\d+)\((\d+\,?\.?\d+)\-(\d+\.?\,?\d+)\)$ 
+0

http://regex101.com/r/vR4fY4/22 разбивает один случай – vks

Смежные вопросы