Named backreferences with preg_replace

前端 未结 4 1107
说谎
说谎 2021-01-04 11:30

Pretty straightforward; I can\'t seem to find anything definitive regarding PHP\'s preg_replace() supporting named backreferences:

// should mat         


        
相关标签:
4条回答
  • 2021-01-04 11:33

    They exist:

    http://www.php.net/manual/en/regexp.reference.back-references.php

    With preg_replace_callback:

    function my_replace($matches) {
        return '/user/profile/' . $matches['id'];
    }
    $newandimproved = preg_replace_callback('#^user/(?P<id>[^/]+)$#Di', 'my_replace', $string);
    

    Or even quicker

    $newandimproved = preg_replace('#^user/([^/]+)$#Di', '/user/profile/$1', $string);
    
    0 讨论(0)
  • 2021-01-04 11:44

    you can use this :

    class oreg_replace_helper {
        const REGEXP = '~
    (?<!\x5C)(\x5C\x5C)*+
    (?:
        (?:
            \x5C(?P<num>\d++)
        )
        |
        (?:
            \$\+?{(?P<name1>\w++)}
        )
        |
        (?:
            \x5Cg\<(?P<name2>\w++)\>
        )
    )?
    ~xs';
    
        protected $replace;
        protected $matches;
    
        public function __construct($replace) {
            $this->replace = $replace;
        }
    
        public function replace($matches) {
            var_dump($matches);
            $this->matches = $matches;
            return preg_replace_callback(self::REGEXP, array($this, 'map'), $this->replace);
        }
    
        public function map($matches) {
            foreach (array('num', 'name1', 'name2') as $name) {
                if (isset($this->matches[$matches[$name]])) {
                    return stripslashes($matches[1]) . $this->matches[$matches[$name]];
                }
            }
            return stripslashes($matches[1]);
        }
    }
    
    function oreg_replace($pattern, $replace, $subject) {
        return preg_replace_callback($pattern, array(new oreg_replace_helper($replace), 'replace'), $subject);
    }
    

    then you can use either \g<name> ${name} or $+{name} as reference in your replace statement.

    cf (http://www.rexegg.com/regex-disambiguation.html#namedcapture)

    0 讨论(0)
  • 2021-01-04 11:48

    preg_replace does not support named backreferences.

    preg_replace_callback supports named backreferences, but after PHP 5.3, so expect it to fail on PHP 5.2 and below.

    0 讨论(0)
  • 2021-01-04 11:56

    preg_replace does not supported named subpatterns yet.

    0 讨论(0)
提交回复
热议问题