2014-09-06 3 views
2

У меня есть специальный тег, который я использую на своих страницах. Этот тег составлен так:Regex не полностью работает

Вход: {{ module : menu : params(mainmenu , index) }}

Теперь проблема им с в том, что вторые пары не читаются моим регулярным выражением, так что я не могу получить доступ к этим параметрам.

Это мой тег им имея проблемы с {{module:menu:params(mainmenu, index)}}

$str = 'params(null)'; 

preg_match_all('{ 
# matches "null" in " null)" 
(?<=\s)[^,]+(?=\)) 

| 

# matches "null" in "(null)" 
(?<=\()[^,]+(?=\)) 

| 

# matches "null" in "params(null" 
(?<=params\()[^,]+ 

|  

# matches "true" in ", true" and ""foo"" in ", "foo"" 
(?<=,\s)[^,]+ 
}x', $str, $matches); 

И теперь регулярное выражение идет на работу и только дает мне значение 1, Что между крючками с Params.

Что PHP дает мне в массив:

$array = array 
(
[0] => module 
[1] => menu 
[2] => params(mainmenu, index) 
); 

Регулярное выражение есть, чтобы соответствовать Params так что это дает мне все, что я Params дать в теге.

Выход Теперь читается только первый параметр, и он дает мне этот результат;

Array 
(
[0] => Array 
    (
     [0] => mainmenu 
    ) 

) 

Требуются/ожидается выход Но я хочу/нужна эта

Array 
(
[0] => Array 
    (
     [0] => mainmenu 
     [1] => index 
    ) 

) 

Я надеюсь, что мой объяснив был достаточно хорош, если его нет, пожалуйста, комментарий, так что я могу сделать его еще более четко.

+0

Каков ваш вклад и ожидаемый результат? –

+1

Его все там. Я поставил больше информации об этом, чтобы сделать его более понятным для вас. –

+0

В вашем вопросе есть три разных ввода. В вашем коде есть «params (null)». Было бы здорово, если бы вы отредактировали свой код, чтобы показать фактический ввод, который вы используете. –

ответ

1

Вы можете попробовать ниже регулярное выражение, чтобы получить массив mainmenu и index строк,

(?<=\()[^,]*|[^\) ]+(?=\)) 

DEMO

Код:

<?php 
$data = " {{module:menu:params(mainmenu, index)}}"; 
$regex = '~\w+[^,\(]+(?=[^()]*\))~'; // this is the solution that works 
preg_match_all($regex, $data, $matches); 
print_r($matches); 
?> 

Выход:

Array 
(
    [0] => Array 
     (
      [0] => mainmenu 
      [1] => index 
     ) 

) 
+0

Im не настоящий pro в regex, но ссылка потрясающая. Маби, если я изменю свой вопрос, это станет для тебя более понятным. Я сейчас просто не знаю, что делать –

+0

Это действительно работает! Но только когда у меня есть только один параметр, я снова получаю проблемы. И когда я чист более 2 параметров, он отображает только 2. –

+0

опубликует строку с более чем двумя параметрами в вашем вопросе. –