Есть ли способ пропустить вложенные скобки в регулярных выражениях? - PullRequest
0 голосов
/ 13 февраля 2019

Я пишу функцию регулярного выражения для PHP preg_match_all, чтобы найти все ifs(...) со всем его содержимым из строки.(В моем примере у меня есть только один ifs, поскольку он не является корнем проблемы.)

Вот что я получил до сих пор:

Pattern: /ifs\(.*?\)/i

Строка: =iferror(ifs(OR("foo", "bar"),"a",OR("tar", "scar"),"b",OR("lar"),"d"),"c")

Текущий вывод: ifs(OR("foo", "bar")

Ожидаемый вывод: ifs(OR("foo", "bar"),"a",OR("tar", "scar"),"b",OR("lar"),"d")

Проблема: регулярное выражение находит первые закрывающие скобки.

Куда я иду не так?И как бы вы взялись за вложенные скобки?

Демо: https://regex101.com/r/SgBqbW/1

1 Ответ

0 голосов
/ 13 февраля 2019

На самом деле вы можете сделать это благодаря возможности PHP рекурсивных регулярных выражений .Это вдохновлено комментарием на этой странице:

$string = '=iferror(ifs(OR("foo", "bar"),"a",OR("tar", OR("scar", "baa")),"b",OR("lar"),"d"),"c")
blah blah ifs(OR("foo", "bar"),"a") and another one ifs("a", OR("tar", OR("scar", "baa")),"b",OR("lar"),"d")';
$regex = '/ifs(\(((?>[^()]+)|(?-2))*\))/';
preg_match_all($regex, $string, $matches);
print_r($matches[0]);

Вывод:

Array (
    [0] => ifs(OR("foo", "bar"),"a",OR("tar", OR("scar", "baa")),"b",OR("lar"),"d")
    [1] => ifs(OR("foo", "bar"),"a")
    [2] => ifs("a", OR("tar", OR("scar", "baa")),"b",OR("lar"),"d") 
)

Демонстрация на 3v4l.org

...