带有括号的php regex环绕字符串,除非已被非文字括号包围

时间:2011-07-13 20:43:48

标签: php regex

我有一些代码通过组合水平空白区域并将它包围在括号中来扩充正则表达式,除非它已被非反斜括号括起来。我有一段代码正在运行:

$regex_find = preg_replace('/(?<!\()[ \t]{2,}(?!\))/', '([ \t]{2,})', $regex_find);

但是,对于初学者来说,后视广告(?<!\()应该真正允许使用文字左括号\(,而不是一个独立的左括号,(

由于

1 个答案:

答案 0 :(得分:1)

您的原始正则表达式还有另一个问题。尝试运行它:

 $str = "asdf(     )sdf     sdf";
 //results in: "asdf( (   ) )sdf(     )sdf"

这个正则表达式应该有效:

$regex_find = '(    asdf(     )sdf     sdf';
preg_replace('/(?<!(\(|\s)(?=\s*\)))\s{2,}/','($0)',$regex_find);
//result = "((    )asdf(     )sdf(     )sdf"

修改:以下是Qtax的解决方案,其中包含额外的lookbehind以忽略转义\(

/(?<!((?<!\\)\(|\s)(?=\s*\)))\s{2,}/