【问题标题】:How to remove text inside brackets and parentheses at the same time with any whitespace before if present?如何同时删除括号和括号内的文本以及之前的任何空格(如果存在)?
【发布时间】:2019-05-09 12:55:07
【问题描述】:

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

我使用的代码是:

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

我得到的输出是:

Deadpool [](Blu-ray)

但是,所需的输出是:

Deadpool 2

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

【问题讨论】:

  • @snowflakes 只有一个示例字符串,我们只能为您提供通用解决方案。如果您提供 10 个不同的字符串,其中一些应该揭示任何边缘情况,我们可以为您的任务开发自己的逻辑 - 而不是盲目地接受您的逻辑。我看到您收到了可以接受的答案,但如果问题有所改进,我们或许可以为您提供更优质的答案。
  • 这个问题正在讨论on meta

标签: php regex


【解决方案1】:

这里有四个要点:

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

你可以使用

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

查看regex demoPHP demo

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

正则表达式graph及解释:

  • \s* - 0+ 个空格
  • (?: - non-capturing group 的开始:
    • \[[^][]*] - [,除[] 之外的零个或多个字符(请注意,如果] 在初始[ 之后,则可以将这些括号保留在PCRE 模式中未转义的字符类中,在JS,你必须逃跑][^\][]*)
    • | - 或(alternation operator
    • \([^()]*\) - (,除 ()) 之外的任何 0+ 个字符
  • ) - 非捕获组结束。

【讨论】:

    【解决方案2】:

    仅基于一个示例输入,有一些更简单的方法。

    $string = "Deadpool 2 [Region 4](Blu-ray)";
    var_export(preg_replace("~ [[(].*~", "", $string));
    
    echo "\n";
    
    var_export(strstr($string, ' [', true));
    

    输出:

    'Deadpool 2'
    'Deadpool 2'
    

    这些假设不需要的子字符串的开头以空格开头的方括号开头。

    strstr() 技术要求字符串中存在空格大括号序列。

    如果不需要的子字符串标记没有始终包含,那么您可以使用:

    var_export(explode(' [', $string, 2)[0]);
    

    这会将不需要的子字符串放入explode的输出数组[1],并将想要的子字符串放入[0]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多