【问题标题】:How to let regex ignore everything between brackets?如何让正则表达式忽略括号之间的所有内容?
【发布时间】:2012-03-02 09:47:55
【问题描述】:

考虑以下字符串:

I have been driving to {Palm.!.Beach:100} and it . was . great!!

我使用以下正则表达式删除所有标点符号:

$string preg_replace('/[^a-zA-Z ]+/', '', $string);

这个输出:

I have been driving to PalmBeach and it  was  great!!

但我需要正则表达式始终忽略 { 和 } 之间的任何内容。所以期望的输出是:

I have been driving to {Palm.!.Beach:100} and it  was  great

如何让正则表达式忽略 { 和 } 之间的内容?

【问题讨论】:

标签: php regex


【解决方案1】:

试试这个

[^a-zA-Z {}]+(?![^{]*})

here on Regexr

表示匹配任何不包含在否定字符类中的内容,但前提是前面没有右括号而前面没有开头,这是通过负前瞻(?![^{]*}) 完成的。

$string preg_replace('/[^a-zA-Z {}]+(?![^{]*})/', '', $string);

【讨论】:

  • 我的错误 - 我忘记了所有不在括号内的内容都应返回小写的要求。所以,再一次,括号之间的内容是单独的。这个正则表达式是否可以以小写形式返回其余部分?
  • 我会说,不在同一个 preg_replace 内。但在第二步没有问题。检查此link 它应该可以帮助您入门。如果您有问题,请提出一个新问题。
【解决方案2】:
$str = preg_replace('(\{[^}]+\}(*SKIP)(*FAIL)|[^a-zA-Z ]+)', '', $str);

另见Split string by delimiter, but not if it is escaped

【讨论】:

  • 我在一个(我现在看到的)重复问题中遇到了一个有点similar conclusion(基于您的链接答案;))。
  • 是的,+100 (*SKIP)(*F)!... @Pr0no 这是一个非常有用和有趣的技术,this 详细解释了它。 :)
猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多