Regex - игнорировать определенные символы в кавычках - PullRequest
0 голосов
/ 04 октября 2010

Я пытался найти ответ на этот вопрос, но не смог найти ничего слишком полезного в этой ситуации. Возможно, я не ищу правильные термины.

У меня проблемы с этим регулярным выражением. Рассмотрим эту строку:

$str = "(1, 2, 'test (foo) bar'), (3, 4, '(hello,world)')";

Я хочу получить многомерный массив, например:

$arr = array(
   array(1, 2, 'test (foo) bar'),
   array(3, 4, '(hello,world)')
);

Я полагаю, я мог бы запустить регулярное выражение, чтобы разделить его на отдельные строки, такие как "(1, 2, 'test (foo) bar')" и "(3, 4, '(hello, world)')", и затем запустите регулярное выражение для каждого из них, чтобы разделить их запятыми, но, как вы можете видеть, моя проблема в том, что данные содержат круглые скобки и запятые в различных строках, и я хотел бы игнорировать их.

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

preg_match_all('/\((.*?)\),?/', $str, $matches);

Это дает мне это:

Array
(
    [0] => Array
        (
            [0] => (1, 2, 'test (foo)
            [1] => (3, 4, '(hello,world)
        )

    [1] => Array
        (
            [0] => 1, 2, 'test (foo
            [1] => 3, 4, '(hello,world
        )

)

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 04 октября 2010

([0-9]+), (\'([A-Za-z0-9(), ]+)\')?

Это похоже на то, что вы хотите.

$matches Array:
(
[0] => Array
    (
        [0] => 1, 
        [1] => 2, 'test (foo) bar'
        [2] => 3, 
        [3] => 4, '(hello,world)'
    )

[1] => Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
    )

[2] => Array
    (
        [0] => 
        [1] => 'test (foo) bar'
        [2] => 
        [3] => '(hello,world)'
    )

[3] => Array
    (
        [0] => 
        [1] => test (foo) bar
        [2] => 
        [3] => (hello,world)
    )
)

Это ближе?

0 голосов
/ 07 августа 2013

Попробуйте этот шаблон:

$pattern = '/((?:.*?),(?:.*?),(?:.*?)),(.*)/';

это имеет выход

Array
(
    [0] => Array
        (
            [0] => (1, 2, 'test (foo) bar'), (3, 4, '(hello,world)')
        )

    [1] => Array
        (
            [0] => (1, 2, 'test (foo) bar')
        )

    [2] => Array
        (
            [0] =>  (3, 4, '(hello,world)')
        )

)
0 голосов
/ 04 октября 2010

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

\(([^']*?'.*?')\),?
...