首页 > 解决方案 > 如何同时删除括号和括号内的文本以及之前的任何空格(如果存在)?

问题描述

我正在尝试使用以下代码清理 PHP 中的字符串,但我不确定如何同时删除括号和括号内的文本以及之前的任何空格(如果存在)。

我正在使用的代码是:

$string = "Deadpool 2 [Region 4](Blu-ray)";
echo preg_replace("/\[[^)]+\]/","",$string); 

我得到的输出是:

Deadpool [](Blu-ray)

但是,所需的输出是:

Deadpool 2

使用这个这个问题的解决方案,不清楚如何删除一种类型的匹配项和另一种类型的匹配项,同时还删除它们之前的可选空格。

标签: phpregex

解决方案


这里有四个要点:

  • 括号之间的字符串可以匹配\([^()]*\)
  • 方括号之间的字符串可以匹配\[[^][]*](或者\[[^\]\[]*\]如果您更喜欢转义文字[],在 PCRE 中,它是风格的,但在其他一些正则表达式风格中,它可能是必须的)
  • 您需要交替匹配这个或那个模式,并在这些模式之前考虑任何空格
  • 由于删除这些字符串后,您可能会得到前导和尾随空格,因此您需要trim字符串。

您可以使用

$string = "Deadpool 2 [Region 4](Blu-ray)";
echo trim(preg_replace("/\s*(?:\[[^][]*]|\([^()]*\))/","", $string)); 

请参阅正则表达式演示PHP 演示

\[[^][]*]部分匹配介于[]没有其他[]内部的\([^()]*\)字符串,并匹配介于()没有其他括号之间的字符串。trim删除前导/尾随空格。

正则表达式和解释:

在此处输入图像描述

  • \s*- 0+ 个空格
  • (?:-非捕获组的开始:
    • \[[^][]*]- ,除and[之外的零个或多个字符(请注意,如果正好在初始之后,您可以将这些括号保留在 PCRE 模式中未转义的字符类中,在 JS 中,您必须通过各种方式转义,)[]][][^\][]*
    • |- 或(交替运算符
    • \([^()]*\)- ,除and和 a之外的(任何 0+ 个字符())
  • )- 非捕获组的结束。

推荐阅读