9

mmmh दोस्तों, मुझे उम्मीद है कि मेरी अंग्रेजी मुझे जो कुछ चाहिए उसे समझाएं।क्या preg_replace_callback कॉलबैक फ़ंक्शन में कोई अन्य पैरामीटर पास करने का कोई तरीका है?

इस उदाहरण लेते हैं (जो सिर्फ एक उदाहरण है!) कोड की:

class Something(){ 
    public function Lower($string){ 
     return strtolower($string); 
    } 
} 
class Foo{ 
    public $something; 
    public $reg; 
    public $string; 
    public function __construct($reg, $string, $something){ 
     $this->something = $something; 
     $this->reg = $reg; 
     $this->string = $string; 
    } 
    public function Replace(){ 
     return preg_replace_callback($this->reg, 'Foo::Bar', $this->string); 
    } 
    public static function Bar($matches){ 
     /* 
     * [...] 
     * do something with $matches and create the $output variable 
     * [...] 
     */ 

     /* 
     * I know is really useless in this example, but i need to have an istance to an object here 
     * (in this example, the Something object, but can be something else!) 
     */ 
     return $this->something->Lower($output); 
    } 
} 
$s = new Something(); 
$foo = new Foo($myregexp, $mystring, $s); 
$content = $foo->Replace(); 

तो, php मैनुअल का कहना है कि preg_replace_callback() में कॉलबैक के रूप में एक वर्ग विधि का उपयोग करने, विधि सार होना चाहिए ।

मैं (, Something वर्ग का एक उदाहरण उदाहरण में) कॉलबैक समारोह में previuosly प्रारंभ वस्तु का एक उदाहरण पारित करने के लिए की जरूरत है।

मैं call_user_func() का उपयोग करने के लिए tryed है, लेकिन काम नहीं करता है (इस तरह से becose मैं matches पैरामीटर याद आती है)।

वहाँ ऐसा करने के लिए एक रास्ता है, या मैं प्रक्रिया अलग करने के लिए है (preg_match_all से पहले कर रही है, प्रत्येक मैच के लिए की जगह मान प्राप्त है, और फिर एक सरल preg_replace)?

संपादित करें: अतिरिक्त नोट के रूप में, टॉम Haigh जवाब से पहले, मैं प्रयोग किया जाता है इस काम के आसपास (उदाहरण में, इस पद्धति की जगह है):

$has_dynamic = preg_match_all($this->reg, $this->string, $dynamic); 
if($has_dynamic){ 
    /* 
    * The 'usefull' subset of my regexp is the third, so $dynamic[2] 
    */ 
    foreach($dynamic[2] AS $key => $value){ 
     $dynamic['replaces'][$key] = $this->Bar($value); 
    } 
    /* 
    * ..but i need to replace the complete subset, so $dynamic[0] 
    */ 
    return str_replace($dynamic[0], $dynamic['replaces'], $this->string); 
}else{ 
    return $this->string; 
} 

आशा किसी की मदद कर सकते हैं।

उत्तर

13

यह कॉलबैक करने के लिए तर्क पारित करने के लिए कठिन है, लेकिन इसके बजाय इस की:

return preg_replace_callback($this->reg, 'Foo::Bar', $this->string); 

आप Bar() स्थिर नहीं कर सकता है, और प्रयोग करें:

return preg_replace_callback($this->reg, array($this, 'Bar'), $this->string); 

तो कॉलबैक फ़ंक्शन में सक्षम हो जाएगा Pseudo-types and variables

में $this

देखें 'कॉलबैक'

को देखने के लिए

PHP> = 5.3 में भी आप कॉलबैक फ़ंक्शंस में अन्य डेटा पास करने के लिए anonymous functions/closures का उपयोग कर सकते हैं।

+0

यह काम करता है! मैंने सोचा कि कक्षा विधि स्थिर होना चाहिए, याद नहीं है कि मैंने इसे कहाँ पढ़ा ..शायद मैं बिल्कुल भी नहीं था और मैं कुछ वाक्य के साथ गंदा। धन्यवाद – Strae

12

create_function() और call_user_function() विधियों के साथ कॉलबैक पर एक तर्क (अतिरिक्त पैरामीटर) पास करने का प्रयास करते समय मैं अटक गया।

इस संदर्भ के लिए है:

<?php 
$pattern = "/([MmT][a-z]*)/"; 
$string = "Mary is a naughty girl because she took all my animals."; 
$kill = "Mary"; 

echo preg_replace_callback($pattern, function($ma) use ($kill) { 

    foreach ($ma as $m){ 
     if ($m == $kill){ 
      return "Jenny"; 
     } 
     return "($m)"; 
    } 
}, $string); 

echo "\n"; 
?> 

$ php preg_replace_callback.php 
Jenny is a naughty girl because she took all (my) ani(mals). 
+0

'use' कीवर्ड को ध्यान देना चाहिए पीएचपी 5.4 में जोड़ा गया है। ज्यादातर सर्वर अभी भी 5.3 :( – mpen

+1

'use' कीवर्ड @Mark चल रहे हैं PHP5.3 –

+0

@WouterJ में जोड़ा जाता है:। सही लेकिन वे जोड़ा' $ this' समर्थन में 5.4 – mpen

0

हाँ मैं और एक बदलते चर को सेट किए बिना स्थापित करने के लिए इतना है कि यह कॉलबैक फ़ंक्शन पर उपलब्ध है कुछ इस तरह का उपयोग करें और आप की जरूरत नहीं है नए php यह करने के लिए: कॉलबैक फ़ंक्शन $ में तो

foreach ($array as $key) { 
    $this->_current_key = $key; 
    preg_replace_callback($regex, array($this, '_callback'), $content); 
    unset($this->_current_key); 
} 

इस -> _ current_key उपलब्ध है:

function _callback ($match) {  
    //use the key to do something 
    new_array[$key] = $match[0]; 

    //and still remove found string 
    return ''; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे