2011-03-10 10 views
11

के साथ नामित बैकरेक्शंस बहुत सरल; मैं PHP के preg_replace() समर्थन नामित backreferences के बारे में कुछ भी निश्चित खोजने के लिए प्रतीत नहीं कर सकते:preg_replace

// should match, replace, and output: user/profile/foo 
$string = 'user/foo'; 
echo preg_replace('#^user/(?P<id>[^/]+)$#Di', 'user/profile/(?P=id)', $string); 

यह एक तुच्छ उदाहरण है, लेकिन अगर यह वाक्य रचना, (?P=name) बस समर्थित नहीं है मैं सोच रहा हूँ। Syntactical मुद्दा, या अस्तित्वहीन कार्यक्षमता?

उत्तर

10

वे मौजूद हैं:

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

preg_replace_callback के साथ:

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

या भी जल्दी

$newandimproved = preg_replace('#^user/([^/]+)$#Di', '/user/profile/$1', $string); 
+1

** धन्यवाद दिमित्रि; ** जवाब * * समर्थित नहीं है, तो मैं बस गिने संदर्भ पर वापस लौटने की जाती है। – Dan

+1

आप नामांकित मैचों का उपयोग preg_replace_callback के साथ कर सकते हैं। – Dimitry

+0

आह, सरणी तर्क से ... जानना अच्छा है, हालांकि यहां उद्देश्य के अनुरूप नहीं है। अरे, गधे में क्या दर्द है। – Dan

1

preg_replace अभी तक नामित subpatterns समर्थित नहीं करता है।

4

preg_replace नामित बैक्रेरेंस का समर्थन नहीं करता है।

preg_replace_callback नामित बैकरेन्शन का समर्थन करता है, लेकिन PHP 5.3 के बाद, इसलिए यह PHP 5.2 और नीचे विफल होने की उम्मीद है।

+1

"नामित उप-पैटर्न के पीछे संदर्भ (? पी = नाम) या PHP 5.2.2 के बाद से \ k या \ k'name 'द्वारा प्राप्त किए जा सकते हैं। इसके अतिरिक्त PHP 5.2.4 ने \ k {name के लिए समर्थन जोड़ा } और \ g {name}। " यह उद्धरण (Dimitry के प्रदत्त लिंक से) 'preg_match()' और 'preg_match_all()' पर लागू होता है, सही? – Dan

+0

हां, यह केवल पैटर्न पर लागू होता है। – Thai

0

आप इस का उपयोग कर सकते हैं:

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); 
} 

तो आप अपने को बदलने के बयान में संदर्भ के रूप में या तो \g<name> ${name} or $+{name} उपयोग कर सकते हैं।

सीएफ (http://www.rexegg.com/regex-disambiguation.html#namedcapture)