删除括号之间的文本 PHP

Posted

技术标签:

【中文标题】删除括号之间的文本 PHP【英文标题】:Remove Text Between Parentheses PHP 【发布时间】:2011-01-11 13:47:34 【问题描述】:

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

例子:

ABC(测试1)

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

谢谢

【问题讨论】:

【参考方案1】:
$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

【讨论】:

你不应该尝试在你的角色类中逃避 )。 不幸的是,这不会删除嵌套的括号,例如 A (B (C) D),而是留下 A D 如果一个人正在处理文本(比如从我的评论中间删除它) - 那么这个功能很好。嵌套括号通常不会出现在文本字符串中,至少在英语中不会出现,而是在数学方程式中。 @cmptrgeekken 谢谢你的简短总结:)【参考方案2】:

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

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

【讨论】:

我喜欢这个!不要忘记替换可能留在结果字符串中的潜在额外空格 这是迄今为止我找到的最佳解决方案。我也很好奇如果我不小心留下了一个流浪的“(”会发生什么。它做了我认为它会做的事情:别管它。结果出现了一些额外的文本,但它没有破坏任何东西。我很高兴。【参考方案3】:

没有正则表达式

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

【讨论】:

这适用于“ABC(测试)”但在“ABC(测试)DEF(更难的测试)”上失败了,它变得非常非常混乱。【参考方案4】:
$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

【讨论】:

【参考方案5】:

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

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

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

另见这篇关于“正确匹配括号的语言”的***文章:https://en.wikipedia.org/wiki/Dyck_language

【讨论】:

PHP 的正则表达式不限于常规语言。 \(([^()]*+|(?R))*\) 匹配任意嵌套的括号就好了。 很好的标注。有关该主题的广泛信息:php.net/manual/en/regexp.reference.recursive.php【参考方案6】:

大多数 quik 方法(没有 preg):

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

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

【讨论】:

如果括号在字符串的末尾就完美了【参考方案7】:
$str ="ABC (Test1)";    
echo preg_replace( '~\(.*\)~' , "", $str );      

【讨论】:

以上是关于删除括号之间的文本 PHP的主要内容,如果未能解决你的问题,请参考以下文章

PHP中大括号之间的匹配文本

删除字符串中两个字符(括号)之间的文本

如何删除字符串中外括号之间的所有文本?

在 PHP 中捕获方括号之间的文本

notepad++正则表达式删除大括号之间的所有文本

Python删除方括号和它们之间的无关信息