2010-10-03 12 views
0

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

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

$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 
     ) 

) 

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

Спасибо!

ответ

0

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

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

это работает, когда данные строки, но он не на струнах, как: –

+0

(1, 1), (5, 0), (10, 0), (14, 1), (15, 0), (20, 1), (25, 0), (29, 1), (39, 0) –

+0

Попробуйте это (([^ "] *? *.?) \\) | \\ (([^?] *) \\) ,? – Max

0

([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

ой! вам нужны 1, 2 и 3, 4 тоже. Прости. один момент. – beta0x64

+0

[A-Za-z0-9(),] лучше писать как [^ '] – Max

+0

ну, у меня также будут не буквенно-цифровые символы, поэтому я не могу использовать диапазоны. –

0

Попробуйте эту модель:

$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)') 
     ) 

) 
Смежные вопросы