Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除最后一次出现的括号_Php_Regex - Fatal编程技术网

Php 删除最后一次出现的括号

Php 删除最后一次出现的括号,php,regex,Php,Regex,我要做的是删除字符串中的第二个或最后一组括号 $string = "Some text here (Some Text I want) (Title: Some Text I don't)"; echo preg_replace("/\([^)]+\)/","",$string); 我的正则表达式不是很好,所以这个例子删除了所有的括号,但我只希望删除最后一组 输出应该是这里的一些文本(我想要的一些文本) 注意,如果最后一个代码在那里,那么它总是有一个:。如果只有一组括号,则应将其删除。因此,如

我要做的是删除字符串中的第二个或最后一组括号

$string = "Some text here (Some Text I want) (Title: Some Text I don't)";
echo preg_replace("/\([^)]+\)/","",$string);
我的正则表达式不是很好,所以这个例子删除了所有的括号,但我只希望删除最后一组

输出应该是
这里的一些文本(我想要的一些文本)


注意,如果最后一个代码在那里,那么它总是有一个
。如果只有一组括号,则应将其删除。因此,如果我已经有了
一些文本(我想要的一些文本)
它应该保持这种状态


任何帮助都很好。

您的正则表达式就快到了,但您可以使用负前瞻:

$string = "Some text here (Some Text I want) (Title: Some Text I don't)";
echo preg_replace("/\s*\([^)]+\)(?![^(]*\()/", "", $string);
// Some text here (Some Text I want)

执行以下操作:

$replaced = preg_replace('~^[^(]*\([^)]+\).*\K\([^)]+\)~', '', $yourstring);
在中,请注意如何仅选择第二组括号(以及可选空格)。我们用空字符串替换它

解释

  • ^
    锚定声明我们位于字符串的开头
  • [^(]*
    匹配不是第一个左括号的任何字符
  • \([^]+\)
    匹配第一组PAR
  • *
    贪婪地匹配任何内容,然后回溯到最后一组PAR
  • \K
    告诉引擎放弃与其返回的最终匹配项相距甚远的匹配项
  • \([^)]+\)
    匹配最后一个括号
  • 我们用空字符串替换它

我将确定(的)的最后一个索引,然后删除之后的所有内容


使用strrpos可达到此效果。此处记录了此函数:

仅当a)有多组括号且b)最后一组括号包含冒号时,此函数才会删除最后一组括号

function removeLastParenthesis($string) {

    if(strpos($string,'(') === strrpos($string,'('))
        return $string;

    $beginning = substr($string,0,strrpos($string,'('));    
    $end = substr($string,strrpos($string,'('));
    $end = preg_replace('/\([^\)]*:[^\)]*\)/','',$end);
    return $beginning . $end;
}
试试这个

preg_replace('/\(\w+\:.*?\)/', '', 'Some text here (Some Text I want) (Title: Some Text I don\'t)');
输出

'Some text here (Some Text I want) '
-注-我假设“注:如果存在,则最后一个中始终存在a:”,并且:之前的部分将仅包含a-zA-Z0-9,如OP示例中所示

您可能还需要删除尾随空格。为此目的

preg_replace('/\s*\(\w+\:.*?\)/', '', 'Some text here (Some Text I want) (Title: Some Text I don\'t)');
解释:

  • \s*=一个或多个空格“”
  • (=捕获“(”
  • \w+=多个“a-zA-Z0-9”或[a-zA-Z0-9]+
  • \:=':'--OP指定结束括号将包含此字符(如果存在)
  • .*=任何字符(非贪婪)0或更多
  • )=')'
此外,如果这始终是一行,且在字符串的末尾有结尾),则可以添加$以将其锚定到末尾/\s*(\w+\:*?)$/

这里有一个更可靠的替代方案

 preg_replace('/\s*\([^:]+\:[^(]+\)$/', '', '(dont:remove:me) (do : remove : me)');
输出

'(dont:remove:me)'
演示
您也可以在不使用正则表达式的情况下执行此操作:

$string = "Some text here (Some Text I want) (Title: Some Text I don't)";
if(substr_count($string, '(') > 1 && substr_count($string, ')') > 1){
    $string = substr($string, 0, strrpos($string, '(')).substr($string, strrpos($string, ')') + 1);
}

可能是@igotrot的复制品我在这里呆了很长时间,知道这不是复制品。它不能回答我的实际问题。我的代码已经删除了它们。ThanksIDN't OP write输出应该是
这里的一些文本(我想要的一些文本)
@FuzzyTree你说得对。在你发表评论之前我刚刚测试过。anubhava,如果只有一组括号,那么可以这样做来保留那里的内容吗?如果只有一组括号,我想你也想摆脱它,或者你总是想在结果中保留一组括号?是的,这就是我需要的。3小时前你在哪里。lol:)谢谢你添加它。是的,很抱歉今天早上很忙,所以不能一直在线。它总是捕捉第二个括号,OP说最后一个。检查此链接-感谢您的回答!投票支持对代码进行解释。@Harpreethingh已修复。我已经不了解这方面的要求,谢谢你提出来。:)@PanamaJack现在可以确保第一组PAR保持不变,并且只删除最后一组(无论是第二组、第三组还是以后的)我喜欢这个,因为它是一个单班轮,仍然有效。谢谢你。我喜欢另一种选择。我使用zk81是因为它是一个很好的单行程序,无论是否有冒号,它都能满足我的需要。