当^ inside括号不是一个选项时,有一种方法可以在regex中使用not运算符吗?

时间:2014-09-13 22:59:47

标签: php regex

我经历了十几个已经回答的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 );

那么,那么允许我获得想要结果的正则表达式是什么?

2 个答案:

答案 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);

test at regex101; eval.in