【问题标题】:PHP Remove Text Between [ and ] ParenthesesPHP删除[和]括号之间的文本
【发布时间】:2013-12-27 17:44:48
【问题描述】:

我需要删除包含在 [ 和 ] 括号(以及括号)之间的文本。

例如:

你好,[你好吗]

必须变成:

你好,

还有一个字符串,如:

你好,[怎么样][是]你

必须变成:

你好,你

有一个正则表达式可以做到这一点吗?

【问题讨论】:

  • 嵌套怎么样?是否需要处理[foo[bar]baz]之类的字符串?
  • 还有多余的空格,要不要去掉?

标签: php regex string


【解决方案1】:

您只需要使用preg_replace 函数删除[] 之间的所有内容。

$a = 'hello, [how][are] you';

echo preg_replace('#\s*\[.+\]\s*#U', ' ', $a); // hello, you

正则表达式捕获前后的每个空格并将其替换为单个空格。

注意,[] 是正则表达式中的保留字符,您需要使用\ 对其进行转义。如果您想保留在您的字符串中写入[] 的可能性(中间没有任何内容),您可以将.* 转换为.+

【讨论】:

  • 嵌套方括号Hello, [how [are] you]?会发生什么我的猜测是它会导致Hello, you]?。 (未验证)如果保证不会发生此类构造,Maxime 的解决方案应该有效。
  • @hek2mgl 通过截断前后空格(并在替换中插入单个空格)修复
  • 添加 Ungreedy 修饰符,满意吗? :)
  • @hek2mgl 实际上,我明确地在之间添加了一个空格,我发现由[] 分隔的两个元素之后应该连接起来。但这是我个人的解释:)
  • 为什么不直接使用这个preg_replace('~\[.*?\]\s?~', '', $str)
【解决方案2】:

如果你想处理嵌套括号和额外的水平空格,你可以使用它:

$txt = preg_replace('~\h*\[(?:[^][]+|(?R))*+]\h*~', ' ', $txt);

或使用展开的循环:

$txt = preg_replace('~\h*\[[^][]*+(?:(?R)[^][]*)*+]\h*~', ' ', $txt);

【讨论】:

  • 天哪,为什么这么复杂?您在哪些情况下设法拥有如此长的正则表达式?
【解决方案3】:

这个怎么样?

print preg_replace('/\[[^\[\]]*\]/', '', $str);

【讨论】:

    【解决方案4】:

    使用此模式\[.*?\](?![^\[\]]*\]) 也可以处理嵌套Demo

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 2016-07-31
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多