Регулярное выражение для удаления второй пары скобок (только при наличии) - PullRequest
1 голос
/ 19 мая 2010

У меня есть что-то вроде этого:

$arr[] = 'Seto Hakashima'
$arr[] = 'Anna (segment "Yvan Attal") (as Robin Wright Penn)'
$arr[] = 'Sara (segment "Yvan Attal")'

Мне нужно удалить вторую пару скобок (только когда есть вторая пара) и получить это:

$arr[] = 'Seto Hakashima'
$arr[] = 'Anna (segment "Yvan Attal")'
$arr[] = 'Sara (segment "Yvan Attal")'

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Это работает:

<?php
$arr[] = 'Seto Hakashima';
$arr[] = 'Anna (segment "Yvan Attal") (as Robin Wright Penn)';
$arr[] = 'Sara (segment "Yvan Attal")';
$arr[] = 'Anna (segment "Yvan Attal") (as Robin Wright Penn) BONUS text after second group';

foreach ($arr as $item) {
    print preg_replace('/(\([^\)]*\)[^\(]+)\([^\)]*\)\s*/','$1',$item) . "\n";
}

Выход:

Сето Хакашима

Анна (сегмент "Иван Атталь")

Сарасегмент "Yvan Attal")

Анна (сегмент "Yvan Attal") БОНУСНЫЙ текст после второй группы

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

1 голос
/ 19 мая 2010

Попробуйте

preg_replace('/^([^(]+(?:\([^)]+\))?).*/','$1', $item);

Несколько объяснений

^          - start of the string
[^(]+      - match characters before first bracket
\([^)]+\)  - match first bracket
(?: ... )? - optional
.*         - eat the rest
$1         - replace with match string

Или просто удалить последнюю часть

preg_replace('/(?<=\))\s*\(.*$/','', $item);

(?<=\))    - if there is ) before pattern
(\s*\(.*$  - remove everything after `(` and also zero or more whitespaces before last bracket.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...