0
assert(isCorrect('') === true);
assert(isCorrect('()') === true); 
assert(isCorrect('{()}') === true);
assert(isCorrect('{()}{}') === true); 
assert(isCorrect('(())') === true);
assert(isCorrect('{({({({()})})})}') === true); 
assert(isCorrect('{(})') === false);

this i have result for preg_match:

function isCorrect($source){
    return (bool)preg_match('~^((\(([^)(}{]|(?1))*\))|\{(?3)*\})*$~', $source);
}

Now I have the same thing only through preg_replace();

2 Answers2

1

Doing recursion could be a little tricky.
For sure you have to account for balanced pairs separately or it doesn't work.

If you expect just characters (){}, this one.

 # '~(\((?:(?>(?1))|)\)|\{(?:(?>(?1))|)\})~'

 (                      # (1 start)
      \(
      (?:
           (?> (?1) )
        |  
      )
      \)
   |  
      \{
      (?:
           (?> (?1) )
        |  
      )
      \}
 )                      # (1 end)

Or, if you expect other characters besides (){} inside, this one.

 #  '~(\((?:(?>[^(){}]+)|(?1))*\)|\{(?:(?>[^(){}]+)|(?1))*\})~'

 (                           # (1 start)
      \(
      (?:
           (?> [^(){}]+ )
        |  
           (?1) 
      )*
      \)
   |  
      \{
      (?:
           (?> [^(){}]+ )
        |  
           (?1) 
      )*
      \}
 )                           # (1 end)
0

^((\(([^)(}{]|(?1))*\))|\{(?3)*\})*$ is the recursive pattern from my comment yesterday which checks if the string is composed of correctly nested ({}) / {()} from ^ start to $ end.

Assuming you want to replace all, that are correctly nested with empty string "" change it to:

$str = preg_replace('~\(([^)(}{]|(?0))*\)|\{(?1)*\}~', "", $str);

Test at regex101; Test at eval.in; Regex FAQ

Please rephrase your question, what acutally you're going to do, if that's not it.

Community
  • 1
  • 1
Jonny 5
  • 12,171
  • 2
  • 25
  • 42