Regex игнорировать разделитель в скобках - PullRequest
2 голосов
/ 19 февраля 2020

Доброе утро, мне нужна твоя помощь. Мне нужно разделить текст с помощью REGEX, но чтобы опустить содержимое в скобках

preg_match_all('/\((?:[^()]|(?R))+\)|\'[^\']*\'|[^(),]+/', $input_lines, $output_array);

У меня есть эта строка: Test A, Test B, Test C (data1, data1)

И pregmatch мы делаем это :

0   =>  Test A
1   =>   Test B
2   =>   Test C 
3   =>  (data1, data1)

Как мне достичь этого результата?

0   =>  Test A
1   =>  Test B
2   =>  Test C (data1, data1)

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

Заранее спасибо за любую помощь.

РЕДАКТИРОВАТЬ

Это случайно решило мою ситуацию. Я пытался использовать preg split.

preg_split('/,(?![^(]*\)) /', $input_line);

1 Ответ

2 голосов
/ 19 февраля 2020

Что вы можете сделать, это использовать рекурсивный шаблон для рекурсии первого подшаблона, используя (?1), чтобы соответствовать всем круглым скобкам, чтобы разделение также не разделялось внутри скобок, и использовать SKIP FAIL .

Затем разделите запятую, за которой следуют 0+ горизонтальных пробельных символов

(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,\h*

Regex demo | Php демо

$re = '/(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,\h*/';
$strings = [
    "Test A, Test B, Test C (data1, data1)",
    "Test A, Test B, Test C (data1, data1), Test D (data1, data1), Test E (data1, data1(data, data))",
    "Test A, Test B, Test C (data1, data1), Test D (data1, data1), Test E ((data1, data1))"
];

foreach($strings as $s) {
    print_r(preg_split($re, $s));
}

Выход

Array
(
    [0] => Test A
    [1] => Test B
    [2] => Test C (data1, data1)
)
Array
(
    [0] => Test A
    [1] => Test B
    [2] => Test C (data1, data1)
    [3] => Test D (data1, data1)
    [4] => Test E (data1, data1(data, data))
)
Array
(
    [0] => Test A
    [1] => Test B
    [2] => Test C (data1, data1)
    [3] => Test D (data1, data1)
    [4] => Test E ((data1, data1))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...