删除括号之间的文本 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的主要内容,如果未能解决你的问题,请参考以下文章