69

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

例子 :

ABC(测试1)

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

谢谢

4

7 回答 7

183
$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
于 2010-02-01T02:46:31.293 回答
20

接受的答案非常适合非嵌套括号。对正则表达式的轻微修改允许它在嵌套括号上工作。

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string);
于 2015-08-03T13:06:37.330 回答
13

没有正则表达式

$string="ABC (test)"
$s=explode("(",$string);
print trim($s[0]);
于 2010-02-01T02:49:53.890 回答
13
$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.

于 2012-05-30T00:44:57.807 回答
4

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

以上所有答案都将在此字符串上失败:“ABC(你好(世界)你好吗)”。

阅读 Jeff Atwood 的 Parsing Html The Cthulhu Way:https ://blog.codinghorror.com/parsing-html-the-cthulhu-way/ ,然后使用手动编写的解析器(遍历字符串中的字符,请参阅如果字符是否是括号,请维护一个堆栈)或使用能够解析上下文无关语言的词法分析器/解析器。

另请参阅有关“正确匹配括号的语言”的这篇维基百科文章:https ://en.wikipedia.org/wiki/Dyck_language

于 2010-02-01T07:09:33.993 回答
3

最快速的方法(没有 preg):

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

如果您不想修剪单词末尾的空格,只需从代码中删除修剪功能。

于 2016-10-19T12:28:39.800 回答
3
$str ="ABC (Test1)";    
echo preg_replace( '~\(.*\)~' , "", $str );      
于 2017-07-06T08:56:37.343 回答