2013-02-28 2 views
2

У меня есть строка как {ASK(Value, Value, 'Sentence', Some_Char)}, и мне нужно получить взорванные значения в (). Что я делаю неправильно?Explode with regexp

preg_match_all('/\{ASK\((.*?),\)\}/', '{ASK(Value, Value, \'Sentence\', X)}', $matches); 
print_r($matches); 
+0

ну, ничего в '{ASK (Value, Value, 'Sentence', Some_Char)}' заканчивается ',)}', поэтому вы ничего не соглашаетесь –

+0

Что такое формат строки? Один пример не сокращает его. Я могу написать регулярное выражение, которое работает для этого примера, но может не получиться некоторое время в будущем. – nhahtdh

+0

@JanDvorak как я понял '(. *?),' Должен искать каждый раз до ',' или я ошибаюсь? – Kin

ответ

0

Выньте запятую из своего обычного выражения, и она соответствует.

preg_match_all('/\{ASK\((.*?)\)\}/', '{ASK(Value, Value, \'Sentence\', X)}', $matches); 
print_r($matches); 

//Explode the matched group 
$exploded = explode(',',$matches[1]); 
print_r($exploded); 

/* 
* Note that we used $matches[1] instead of $matches[0], 
* since the first element contains the entire matched 
* expression, and each subsequent element contains the matching groups. 
*/ 
0
$s = "{ASK(Value, Value, 'Sentence', Some_Char)}"; 
$p = '#\{ASK\((.*?)\)\}#'; 
preg_match_all($p, $s, $matches); 
print_r($matches); 
0

Просто разбейте & взрываются

$Myval = "{ASK(Value, Value, 'Sentence', Some_Char)}"; 

$splitedVal = split('[()]', $Myval); 

$explodedVal = explode(",", $splitedVal[1]); 

print_r($explodedVal); 

// выводим

Array ([0] => Value [1] => Value [2] => 'Sentence' [3] => Some_Char) 
0

Самый простой способ сделать это (хотя и не полностью содержится в регулярном выражении) может быть:

preg_match_all('/\{ASK\([^)]*\)\}/', '{ASK(Value, Value, \'Sentence\', X)}', $matches); 
$values = explode($matches[1]); 
0

До тех пор, как ваш Values, Sentences и Chars не содержат , или ), то этот единственный шаблон регулярного выражения будет поставлять без дополнительного explode() вызова.

Выкройка: ~(?:\G, |ASK\()\K[^,)]+~ (Pattern Demo)

Код: (Demo)

$string="{ASK(Value, Value, 'Sentence', Some_Char)}"; 

print_r(preg_match_all('~(?:\G, |ASK\()\K[^,)]+~',$string,$out)?$out[0]:[]); 

Выход:

Array 
(
    [0] => Value 
    [1] => Value 
    [2] => 'Sentence' 
    [3] => Some_Char 
) 

"Магия" находится в \G. Это говорит регулярному выражению продолжить сопоставление в начале строки или сразу после предыдущего совпадения. Вот аналогичный ответ, который я опубликовал: https://stackoverflow.com/a/48373347/2943403