如何使用reg ex通过preg_replace()编写函数

时间:2014-09-24 12:19:25

标签: php regex

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

这个我有preg_match的结果:

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

现在我只能通过preg_replace();

来做同样的事情

2 个答案:

答案 0 :(得分:1)

做递归可能有点棘手 当然,你必须单独考虑平衡对,否则它不起作用。

如果您只想要字符(){},那么这个。

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

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

或者,如果您希望除了(){}之外的其他字符,那么这个。

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

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

答案 1 :(得分:0)

^((\(([^)(}{]|(?1))*\))|\{(?3)*\})*$recursive模式from my comment yesterday ^$开始到""结束。

假设您要替换所有正确嵌套空字符串$str = preg_replace('~\(([^)(}{]|(?0))*\)|\{(?1)*\}~', "", $str); 的所有内容,请将其更改为:

{{1}}

checks if the string is composed of correctly nested ({}) / {()}; Test at regex101; Test at eval.in

请重新解释一下你的问题,如果不是这样的话,你会做什么。