删除括号之间的文本

我只是想知道如何删除 php 中一组括号和括号本身之间的文本。

例如:

ABC (Test1)

我希望它删除(Test1) ,只留下 ABC

谢谢

69703 次浏览
$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

没有正则表达式

$string="ABC (test)"
$s=explode("(",$string);
print trim($s[0]);

各位,正则表达式不能用于解析非正则语言。非正则语言是那些需要状态来解释的语言(即记住当前打开了多少个括号)。

以上所有答案都将在这个字符串上失败: “ ABC (hello (world) how are you)”。

阅读 Jeff Atwood 的解析 HTML The Cthulhu Way: https://blog.codinghorror.com/parsing-html-the-cthulhu-way/,然后使用一个手写的解析器(循环遍历字符串中的字符,看看这个字符是否是括号,维护一个堆栈)或者使用一个 lexer/解析器来解析一个上下文无关语言。

也可以看看这篇关于“正确匹配括号的语言”的维基百科文章: https://en.wikipedia.org/wiki/Dyck_language

$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中。

接受的答案对于非嵌套括号非常有用。对正则表达式稍作修改就可以处理嵌套的括号。

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string);

最快捷的方法(不含 Preg) :

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

如果你不想修剪字尾的空格,只需从代码中删除修剪函数。

$str ="ABC (Test1)";
echo preg_replace( '~\(.*\)~' , "", $str );