仅当内部字符超过一个时才删除括号

Remove parantheses only if inside characters more than one

我只想删除括号内超过一个文本字符的括号。

我的输入是:

$string = "Model name (4) Color (Additional Params)"

我想要的最终输出字符串应该是:"Model name (4) Color Additional Params".

我的解决方案是:

  1. 使用正则表达式检测所需范围 \([^)]{2,}\)
  2. 从原始字符串中剪切。
  3. 删除括号。
  4. 附加回原始字符串。

我知道正则表达式有条件语句。但我无法理解使用它们的逻辑。

是否可以使用单个正则表达式以及如何处理?

可以用一个正则表达式来完成:

$string = 'Model name (4) Color (Additional Params) and some other (a) with more (params)';
$modifiedString = preg_replace('/\(([^\(\)]{2,})\)/', '', $string);
var_dump($modifiedString);

这将给出:

string(74) "Model name (4) Color Additional Params and some other (a) with more params"

模式说明:

  • \( - 匹配文字左括号
  • [^\(\)] - 匹配任何不是左括号或右括号的字符(我们需要这样做,这样它就不会匹配第一个左括号和最后一个右括号之间的所有字符 - (4) Color (Additional Params) )
  • 后面跟着一个量词{2,},表示我们要匹配其中的两个或多个
  • 连同它被包裹在括号中的量词,形成一个捕获组([^\(\)]{2,}) - 这将得到字符串[=中括号的全部内容36=]
  • 最后我们匹配 \) 文字右括号

preg_replace 调用中的第二个参数定义用捕获组 Additional params.

替换我们的完整匹配项 (Additional params)