Удалить текст между круглыми скобками PHP - PullRequest
57 голосов
/ 01 февраля 2010

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

Пример:

ABC (Test1)

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

Спасибо

Ответы [ 7 ]

148 голосов
/ 01 февраля 2010
$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
13 голосов
/ 03 августа 2015

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

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string);
12 голосов
/ 01 февраля 2010

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

$string="ABC (test)"
$s=explode("(",$string);
print trim($s[0]);
11 голосов
/ 30 мая 2012
$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.

4 голосов
/ 01 февраля 2010

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

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

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

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

2 голосов
/ 06 июля 2017
$str ="ABC (Test1)";    
echo preg_replace( '~\(.*\)~' , "", $str );      
2 голосов
/ 19 октября 2016

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

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

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

...