我经历了十几个已经回答的Q而没有找到一个可以帮助我的人。
我有一个这样的字符串:
aaa.{foo}-{bar} dftgyh {foo-bar}{bar} .? {.!} -! a}aaa{
我希望获得这样的字符串:
aaa{foo}-{bar}dftgyh{foo-bar}{bar}-aaaa
基本上我想保留:
\{[\w\-]+\}
使用此:
$result = preg_replace( array( "#\{[\w\-]+\}#", '#[\w\-]#' ), "", $string );
我得到了与我想要的完全相反的东西:我删除了我想要保留的部分。
当然,我可以在第二种模式的方括号内使用^
,但它不适用于第一种模式。
即。这不起作用(数组中的第二个模式是有效的,第一个不是):
$result = preg_replace( array( "#[^\{[\w\-]+\}]#", '#[^\w\-]#' ), "", $string );
那么,那么允许我获得想要结果的正则表达式是什么?
答案 0 :(得分:4)
您可以考虑匹配您想要的内容,而不是替换您不想要的字符。以下内容将匹配花括号内外的单词字符和连字符。
$str = 'aaa.{foo}-{bar} dftgyh {foo-bar}{bar} .? {.!} -! a}aaa{';
preg_match_all('/{[\w-]+}|[\w-]+/', $str, $matches);
echo implode('', $matches[0]);
按预期输出:
aaa{foo}-{bar}dftgyh{foo-bar}{bar}-aaaa
答案 1 :(得分:2)
还可以选择(*SKIP)(*F)好东西,然后使用余下的preg_replace()
:
$str = preg_replace('~(?:{[-\w]+}|[-\w]+)(*SKIP)(*F)|.~' , "", $str);