Php 如何让regex忽略括号之间的所有内容?

Php 如何让regex忽略括号之间的所有内容?,php,regex,Php,Regex,考虑以下字符串: 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 hav

考虑以下字符串:

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
如何让正则表达式忽略{和}之间的内容

$str = preg_replace('(\{[^}]+\}(*SKIP)(*FAIL)|[^a-zA-Z ]+)', '', $str);
另请参见。

试试这个

[^a-zA-Z {}]+(?![^{]*})
看到了吗

表示匹配未包含在否定字符类中的任何内容,但仅当前面没有结束括号而前面没有打开括号时,这是通过负前瞻
(?![^{]*})
完成的


我的错误——我忘记了所有不在括号内的内容都应该以小写返回的要求。所以,再次强调,括号之间的内容是单独存在的。这个正则表达式是否可以用小写形式返回其余的?我想说,不是在同一个preg_替换中。但第二步没问题。勾选这个,它会让你开始。如果你有问题,那么请问一个新问题。我在一个(我现在看到的)重复问题中找到了一个(基于你的链接答案;)。耶,+100表示
(*SKIP)(*F)
@Pr0no这是一种非常有用和有趣的技术,详细解释如下:可能重复的
$string preg_replace('/[^a-zA-Z {}]+(?![^{]*})/', '', $string);