【问题标题】:preg_replace() pattern to remove brackets and content in phppreg_replace() 模式删除 php 中的括号和内容
【发布时间】:2014-08-12 21:43:14
【问题描述】:

我想使用 preg_replace() 删除括号及其内容,但我无法在模式中使用惰性(非贪婪),因为结束括号是结束字符,括号之间的文本总是随机字符长度,可以包含数字、下划线和连字符。

代码-

$array = array(
   "Text i want to keep (txt to remove)",
   "Random txt (some more random txt)",
   "Keep this (remove)",
   "I like bananas  (txt)"
);

$pattern = "@pattern@";
foreach($array as $new_txt){
   $new_outputs .= preg_replace($pattern, '', $new_txt)."\n";
}
echo $new_outputs;

想要的输出-

Text i want to keep
Random txt
Keep this
I like bananas

我很少使用正则表达式,也找不到任何东西可以解决我的问题。

【问题讨论】:

  • “无法在模式中使用惰性”是什么意思?
  • 这就是我所说的不贪心的XD
  • 所以你知道存在非贪婪的*,就像我的回答一样。你为什么不认为你可以使用它?
  • 我确实尝试过使用它,但它从来没有像我尝试过的那样工作 -> @((.*?))@ 就像我说我不经常使用正则表达式
  • 如果您希望特殊字符被逐字处理,您必须转义它们。

标签: php design-patterns preg-replace


【解决方案1】:

下面的正则表达式应该做到这一点:

$pattern = '@\(.*?\)@';

.*? 是任何事物的非贪婪匹配。

【讨论】:

  • ? 不是表示匹配前一个字符的 0 或 1 个吗?
  • 不是在*+之后,则表示非贪婪。
【解决方案2】:
$new_outputs .= preg_replace('@\([^\)]*\)$@','',$new_txt);

【讨论】:

  • 要删除的部分总是在最后吗?这个正则表达式假定它是。
  • 这就是我从帖子中得到的。但如果这不是故意的,请删除 $
  • 所有答案都有效,我很高兴在正确的地方提问,是的,括号总是在字符串的末尾,谢谢大家。
【解决方案3】:

这可能会对您有所帮助:

$pattern = "/\([^)]*\)+/";
foreach($array as $new_txt){
    $new_outputs .= preg_replace($pattern, '', $new_txt)."\n";
}

【讨论】:

  • 为什么是\)+?这个问题从来没有提到如果有多个右括号该怎么办。
  • @Barmar - 哦,抱歉我没注意到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
相关资源
最近更新 更多