2016-08-04 2 views
1

У меня очень плохое понимание RegEx в целом, поэтому я понятия не имею, как можно использовать его в такой проблеме.Соответствие шаблону для значения в кортеже PHP (регулярные выражения?)

Так вот у нас есть кортеж
$tuple = "(12342,43244)";

И то, что я пытаюсь сделать, это получить:
$value_one = 12342;

Так что с (value_one,value_two) получить value_one.

Я знаю, что это может быть возможным с explode(',', $tuple), а затем удалить 1-й символ «(» из 1-го элемента в разобранном массиве, но кажется, что супер неаккуратно, есть способ сопоставления с образцом таким образом в PHP?

+0

'(12342,43244)' является строка? – hsz

+0

Да, извините, ошибка, отредактирована! –

+0

Почему regex? Разверните строку с помощью '(' и затем второго элемента с ','. Или вы имеете в виду, что здесь должна быть какая-то проверка? См. Https://ideone.com/8mQNWY –

ответ

2

Вот простейший preg_match пример с \(([0-9]+) регулярных выражений, который соответствует (, и захватывает в группу 1 одна или несколько цифр от 0 в 9 диапазон:

$tuple = "(12342,43244)"; 
if (preg_match('~\(([0-9]+)~', $tuple, $m)) 
{ 
    echo $m[1]; 
} 

См IDEONE demo

завернутые в функцию:

function retFirstDigitChunk($input) { 
    if (preg_match('~\(([0-9]+)~', $input, $m)) { 
     return $m[1]; 
    } else { 
     return ""; 
    } 
} 

См another demo

Или, to get both as an array:

function retValues($input) { 
    if (preg_match('~\((-?[0-9]+)\s*,\s*(-?[0-9]+)~', $input, $m)) { 
     return array('left'=>$m[1], 'right'=>$m[2]); 
    } else { 
     return ""; 
    } 
} 

$tuple = "(12342,43244)"; 
print_r(retValues($tuple)); 

Выход: Array([left] => 12342 [right] => 43244)

+0

Могу ли я каким-то образом сделать эту динамику и получить второй кусок?Я полагаю, что $ m [2] будет иметь значение 'value_two', поэтому будет' $ output-> left = $ m [1]; $ output-right = $ m [2]; return $ output; 'дайте мне кортеж в stdClass(); тип? –

+0

Нет, это не сработает. Будут ли 2 номера int все время? Если да, используйте '\ ((-? [0-9] +) \ s *, \ s * (-? [0-9] +)' - тогда вы можете использовать '$ m [2]'. –

+0

Да , он всегда будет кортежем и всегда 2 ints в нем '(int, int)' EDIT: Удивительно, спасибо! –

1

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

$value_one = preg_replace('/\((\d+),.*/', '$1', $tuple); 
+0

Любой шанс, что вы можете предоставить функцию или что-то, что я могу использование, которое возвращает его? Помогло бы миллион, так как я действительно не знаю, как использовать RegEx –

+0

, соответствующий '' \ ((\ d +) '' быстрее на величину 2. –

+0

@DenisMakula Я обновил ответ. – horcrux

1

Если вы ищете что-то эффективное, стараются избегать использования регулярных выражений, когда это возможно:

$result = explode(',', ltrim($tuple, '('))[0]; 

или

sscanf($tuple, '(%[^,]', $result);