Истинное регулярное выражение для получения содержимого из круглых скобок - PullRequest
1 голос
/ 11 ноября 2011

Я люблю / ненавижу регулярное выражение из-за полезности / твердости. (Не знаю почему, но я не могу построить шаблон :()
У меня есть несколько записей в моей базе данных, как это

[(ip1=192.x.?.100)(id1=125485smds65)(date1=11.02.2011-15:00/15.06.2012-17:30)(text1=Some text that can include all brackets and/or parentheses & any chars etc, like < ( text . } , [ any ) ] { etc.**)][(ip2=x.x.20.?)(num2=1235845)(text2=many other words :))]...

Хорошо, я хочу вернуть массив, содержащий значение как;

$result[ip1] = 192.x.?.100;
$result[id1] = 125485smds65;
$result[date1] = 11.02.2011-15:00/15.06.2012-17:30;
$result[text1] = Some text that can include all brackets and/or parentheses & any chars etc, like < ( text . } , [ any ) ] { etc.**;
$result[ip2] = 192.x.?.100;
$result[num2] = 1235845;
$result[text2] = many other words :)

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

Итак, каков истинный шаблон для регулярного выражения preg_match_all для сбора вышеуказанных данных?

Ответы [ 2 ]

4 голосов
/ 11 ноября 2011

Попробуйте что-то вроде этого:

$s = '(ip1=192.x.?.100)(id1=125485smds65)(date1=11.02.2011-15:00/15.06.2012-17:30)
(text1=Some text that can include all brackets and/or paranthesis & any chars etc, 
like < ( text . } , [ any ) ] { etc.**)][(ip2=x.x.20.?)(num2=1235845)
(text2=many other words :))';

preg_match_all('/\((?:[^()]|(?R))*\)/', $s, $matches);

print_r($matches);

который напечатает:

Array
(
    [0] => Array
        (
            [0] => (ip1=192.x.?.100)
            [1] => (id1=125485smds65)
            [2] => (date1=11.02.2011-15:00/15.06.2012-17:30)
            [3] => (text1=Some text that can include all brackets and/or paranthesis & any chars etc, 
like < ( text . } , [ any ) ] { etc.**)
            [4] => (ip2=x.x.20.?)
            [5] => (num2=1235845)
            [6] => (text2=many other words :)
        )

)

(?R) в шаблоне регулярных выражений /\((?:[^()]|(?R))*\)/ является рекурсивным вызовом всего шаблона в самом себе.

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

0 голосов
/ 11 ноября 2011

Вы можете сделать:

/(\(([^)=]*)=([^)]*)\))*/

Однако это невозможно. «Некоторый текст, который может включать все скобки и / или парантезы» - как в мире вы могли бы отличить текст от закрывающей скобки?

И в случае, если это очень плохая структура данных. Прежде всего, это база данных - в ней есть столбцы, используйте их! Во-вторых, почему вы катите свою собственную структуру данных? Вы можете использовать json или php's serialize().

Регулярное выражение - неправильный инструмент для этой работы.

...