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

时间:2014-07-07 02:24:42

标签: php regex

我要做的是删除字符串中可能包含的第二组或最后一组括号。

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

我的正则表达式不太好所以这个例子删除了所有的括号,但我只希望删除最后一个集合。

输出应为Some text here (Some Text I want)

请注意,如果有最后一个,:总是有not。如果只有一组括号,则应Some text here (Some Text I want)将其删除。所以,如果我已经{{1}}它应该保持这种状态。

任何帮助都很棒。

6 个答案:

答案 0 :(得分:4)

你的正则表达式几乎就在那里,但你可以使用负向前瞻:

$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)

<强> Regex Demo

答案 1 :(得分:2)

这样做:

$replaced = preg_replace('~^[^(]*\([^)]+\).*\K\([^)]+\)~', '', $yourstring);

the demo中,注意如何仅选择第二组括号(以及可选空格)。我们用空字符串替换它。

<强>解释

  • ^锚点断言我们位于字符串的开头
  • [^(]*匹配任何不是第一个左括号的字符
  • \([^)]+\)匹配第一组句子
  • .*贪婪地匹配任何东西,然后回溯到最后一组文章
  • \K告诉引擎放弃与其返回的最终匹配项目匹配的内容
  • \([^)]+\)匹配最后一个括号
  • 我们用空字符串
  • 替换它

答案 2 :(得分:1)

我会确定最后一个索引(然后删除之后的所有内容。

使用strrpos来达到这个效果。该功能记录在此处:http://www.php.net/manual/en/function.strrpos.php

答案 3 :(得分:1)

仅当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;
}

Demo

答案 4 :(得分:0)

试试这个

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

输出

'Some text here (Some Text I want) '

-note-我假设“注意总是有:在最后一个,如果它在那里。”是的,并且:在:之前的部分将仅包含a-zA-Z0-9_,如在OP的示例中那样。

您可能也想删除尾随空格。用于那个用途

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

<强> Explination:

  • \ s * =一个或多个空格''
  • (= capture'('
  • \ 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)'

演示 http://regex101.com/r/fQ1iD5/39

答案 5 :(得分:0)

您也可以在没有正则表达式的情况下执行此操作:

$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);
}