Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I want to parser and get a two-dimensional matrix using regular expresions of PHP. But I really don't know to parser and get a array(unidimensional). For example, I have this string:

    $str = {a}&{b}&{c}&{d&};

and I want to convert to array like this:

    array( 'a', 'b', 'c', 'd&' )

The pattern should be this:

    $pattern = '#(({[^}]+})(?:&(?1))*#';

The pattern matches correctly but I can't get all elements with $matches parameter:

    preg_match_all( $pattern, $str, $matches );
    print_r( $matches );

Output:

    Array
    (
        [0] => Array
            (
                [0] => {a}&{b}&{c}&{d&}
            )

        [1] => Array
            (
                [0] => a
            )

    )

I try to solve this problem involving the recursive pattern with parentheses.

    $pattern = '#(({[^}]+})(?:&((?1)))*#';

Output:

    Array
    (
        [0] => Array
            (
                [0] => {a}&{b}&{c}&{d&}
            )

        [1] => Array
            (
                [0] => a
            )

        [2] => Array
            (
                [0] => d&
            )

    )

Only is gotten the last element of array. The option flags PREG_PATTERN_ORDER or con PREG_SET_ORDER haven't solved my problem.

Is there any way to get the array of elements?

Greetings and thanks!

share|improve this question
    
Just use the pattern that's been used here like this \{((?:[^{}]|(?R))*)\}, it will even match nested {} :D –  HamZa Nov 7 '13 at 23:33
add comment

3 Answers

up vote 1 down vote accepted

You can use this pattern which captures the content inside curly brackets and checks the syntax (i.e. {..}&{..}&{..}&{..}) :

preg_match_all('~\G{([^}]+)}(?:&|$)~', '{a}&{b}&{c}&{d&}', $result);

\G means "contiguous to a precedent match or at the start of the string". Thus, gaps are not allowed and the syntax is checked by the pattern.

The array you are looking for is $result[1]

share|improve this answer
    
Oh, thanks! this works. I should review the issue escape sequences. –  jefebrondem Nov 8 '13 at 0:29
add comment

Uh, your regex is way overcomplicated.

$pattern = "#{([^}]+)}#";
$data = "{a}&{b}&{c}&{d&}";
preg_match_all($pattern, $data, $matches);
print_r($matches);

Output:

Array
(
    [0] => Array
        (
            [0] => {a}
            [1] => {b}
            [2] => {c}
            [3] => {d&}
        )

    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
            [3] => d&
        )

)

So your desired output is just $matches[1].

share|improve this answer
    
Thanks. Then, should I do two passes to parse $data? Because $data = "{a}|{b}&{c}|{d&}"; is a string succesful. After, I should check '&' characters. –  jefebrondem Nov 7 '13 at 23:50
add comment

for your former question, try:

$str = "a&b&c&d&word";
$pattern = '/[^&]+/';
preg_match_all( $pattern, $str, $matches );
print_r( $matches );

get:

Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
            [2] => c
            [3] => d
            [4] => word
        )
)
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.