Удалить текст между круглыми скобками PHP

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

Пример :

ABC (Test1)

Я бы хотел удалить (Test1) и оставить только ABC

Спасибо


person Belgin Fish    schedule 01.02.2010    source источник


Ответы (6)


$string = "ABC (Test1)";
echo preg_replace("/\([^)]+\)/","",$string); // 'ABC '

preg_replace - это процедура замены регулярных выражений на основе Perl. Этот сценарий сопоставляет все вхождения открывающей круглой скобки, за которой следует любое количество символов не закрывающей круглой скобки, а затем снова следует закрывающая скобка, а затем удаляет их:

Разбивка регулярных выражений:

/  - opening delimiter (necessary for regular expressions, can be any character that doesn't appear in the regular expression
\( - Match an opening parenthesis
[^)]+ - Match 1 or more character that is not a closing parenthesis
\) - Match a closing parenthesis
/  - Closing delimiter
person cmptrgeekken    schedule 01.02.2010
comment
Вы не должны пытаться избежать) в своем классе персонажа. - person mopoke; 01.02.2010
comment
к сожалению, это не удаляет вложенные скобки, такие как A (B (C) D), и оставляет вам A D - person David K.; 12.06.2014
comment
Если кто-то имеет дело с текстом (например, удаление этого из середины моего комментария) - тогда эта функция в порядке. Вложенные скобки обычно не видны в текстовых строках, по крайней мере, не на английском языке, а в математических уравнениях. - person Jeff Clayton; 15.02.2018
comment
@cmptrgeekken Спасибо за ваше краткое резюме :) - person Jean Manzo; 03.03.2019

Принятый ответ отлично подходит для невложенных круглых скобок. Небольшая модификация регулярного выражения позволяет ему работать с вложенными круглыми скобками.

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string);
person Tegan Snyder    schedule 03.08.2015
comment
Мне нравится этот! Не забудьте заменить потенциальные лишние пробелы, которые могут остаться в вашей строке результата, хотя - person Kalle Samuelsson; 09.11.2018
comment
Это, безусловно, лучшее решение, которое я нашел. Мне также было любопытно, что произойдет, если я случайно оставлю бродячую (. И она сделала то, что я думал: просто оставь ее в покое. В результате появился небольшой лишний текст, но он ничего не сломал. Я » м счастлив. - person Matthew Campbell; 13.04.2021

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
$paren_num = 0;
$new_string = '';
foreach($string as $char) {
    if ($char == '(') $paren_num++;
    else if ($char == ')') $paren_num--;
    else if ($paren_num == 0) $new_string .= $char;
}
$new_string = trim($new_string);

Он работает, перебирая каждый символ, считая круглые скобки. Только когда $paren_num == 0 (когда он находится вне скобок), он добавляет символы к нашей результирующей строке $new_string.

person tyjkenn    schedule 30.05.2012

без регулярного выражения

$string="ABC (test)"
$s=explode("(",$string);
print trim($s[0]);
person ghostdog74    schedule 01.02.2010
comment
Это работает для ABC (тест), но не работает для ABC (тест) DEF (более сложный тест), где это очень сильно запутывается. - person ftrotter; 17.08.2018

Ребята, регулярные выражения НЕ МОГУТ использоваться для синтаксического анализа нерегулярных языков. Нерегулярные языки - это языки, для интерпретации которых требуется состояние (т.е. запоминание количества открытых скобок).

Все вышеперечисленные ответы не пройдут с этой строкой: «ABC (привет (мир), как дела)».

Прочтите книгу Джеффа Этвуда по синтаксическому анализу «Путь Ктулху»: https://blog.codinghorror.com/parsing-html-the-cthulhu-way/, а затем используйте написанный от руки синтаксический анализатор (прокрутите символы в строке, посмотрите, является ли символ круглой скобкой или нет, сохраните стек) или используйте лексер / синтаксический анализатор, способный анализировать контекстно-свободный язык.

Также см. Эту статью в Википедии о «языке правильно подобранных скобок»: https://en.wikipedia.org/wiki/Dyck_language

person Alex Weinstein    schedule 01.02.2010
comment
Регулярные выражения PHP не ограничиваются обычными языками. \(([^()]*+|(?R))*\) отлично подходит для произвольно вложенных круглых скобок. - person Tim Pietzcker; 10.08.2013
comment
Хорошая выноска. Подробная информация по теме: php.net/manual/en/regexp.reference. рекурсивный.php - person Alex Weinstein; 17.06.2016

Самый быстрый метод (без preg):

$str='ABC (TEST)';
echo trim(substr($str,0,strpos($str,'(')));

Если вы не хотите обрезать пробелы в конце слова, просто удалите функцию обрезки из кода.

person MERT DOĞAN    schedule 19.10.2016
comment
Это идеально, если круглые скобки находятся в конце строки - person wranvaud; 08.07.2021