2012-03-03 15 views
13

Badałem podobne pytania, ale wciąż nie jestem pewien czy jest to możliwe i/lub najlepszy sposób przekazania dodatkowych argumentów w preg_replace_callback przy użyciu PHP 5.2.6Przekazywanie dodatkowych argumentów do preg_replace_callback za pomocą PHP 5.2.6

W tym przypadku zamierzam również przekazać klucz $ z pętli foreach do funkcji if_replace.

public function output() { 
if (!file_exists($this->file)) { 
    return "Error loading template file ($this->file).<br />"; 
} 
$output = file_get_contents($this->file); 

foreach ($this->values as $key => $value) { 
    $tagToReplace = "[@$key]"; 
    $output = str_replace($tagToReplace, $value, $output); 
    $dynamic = preg_quote($key); 
    $pattern = '%\[if @'.$dynamic.'\](.*?)\[/if\]%'; // produces: %\[if @username\](.*?)\[/if\]% 
    $output = preg_replace_callback($pattern, array($this, 'if_replace'), $output); 
} 

return $output; 
} 



public function if_replace($matches) { 

    $matches[0] = preg_replace("%\[if @username\]%", "", $matches[0]); 
    $matches[0] = preg_replace("%\[/if]%", "", $matches[0]); 
    return $matches[0]; 
} 

Zastanawiasz się, czy coś takiego będzie działać:

class Caller { 

public function if_replace($matches) { 

    $matches[0] = preg_replace("%\[if @username\]%", "", $matches[0]); 
    $matches[0] = preg_replace("%\[/if]%", "", $matches[0]); 
    return $matches[0]; 
} 

} 

$instance = new Caller; 

$output = preg_replace_callback($pattern, array($instance, 'if_replace'), $output); 
+0

Funkcja Acallback to zamknięcie, możesz przekazać dodatkowe argumenty za pomocą użycia, sprawdź odpowiedź na http://stackoverflow.com/questions/16445991/how-do-i-access-a-variable-inside-of-preg -replace-callback – Tester

Odpowiedz

28

Przed PHP 5.3

Można użyć klasy pomocnika:

class MyCallback { 
    private $key; 

    function __construct($key) { 
     $this->key = $key; 
    } 

    public function callback($matches) { 
     return sprintf('%s-%s', reset($matches), $this->key); 
    } 
} 

$output = 'abca'; 
$pattern = '/a/'; 
$key = 'key'; 
$callback = new MyCallback($key); 
$output = preg_replace_callback($pattern, array($callback, 'callback'), $output); 
print $output; //prints: a-keybca-key 

od PHP 5.3

Można użyć anonimowego funkcję:

$output = 'abca'; 
$pattern = '/a/'; 
$key = 'key'; 
$output = preg_replace_callback($pattern, function ($matches) use($key) { 
      return sprintf('%s-%s', reset($matches), $key); 
     }, $output); 
print $output; //prints: a-keybca-key 
+0

Dzięki, to jest dokładnie to, co miałem nadzieję, było możliwe. Doceń próbkę, to jest bardzo jasne i udało mi się to zaadaptować. – jsuissa

+1

Ktokolwiek to czyta: możesz użyć słowa kluczowego 'use' zamiast tego stosunkowo złożonego podejścia (patrz [ta odpowiedź @Mark Baker] (http://stackoverflow.com/a/16446110/722036), aby uzyskać więcej informacji) –

+0

Odpowiedź w powyższym komentarzu z @TheSexiestManinJamaica oferuje znacznie lepsze i prostsze rozwiązanie tego problemu niż dodawanie nowych klas itp. – Chris

2

Niestety nie można. W PHP 5.3 można po prostu użyć zamknięcia, aby uzyskać dostęp do zmiennych, które można przekazać jako parametry.

W twoim przypadku są dwa możliwe rozwiązania: czysty i brudny.

Brudny zapisuje parametry w zmiennych globalnych, dzięki czemu można uzyskać do nich dostęp z poziomu wywołania zwrotnego.

Czysta osoba tworzy klasę, w której przekazywane są parametry, np. przez konstruktora. Następnie używaj array($instance, 'methodName') jako wywołania zwrotnego i po prostu uzyskaj dostęp do parametrów za pośrednictwem metody $this->whatever.

+0

Dzięki, że mam iść w dobrym kierunku. Zaktualizowałem pytanie na podstawie Twojego komentarza. Wierzę, że rozumiem, co sugerujesz. – jsuissa

16
$pattern = ''; 
$foo = 'some text'; 

return preg_replace_callback($pattern, function($match) use($foo) 
{ 
var_dump($foo); 

}, $content); 
+2

działa w php 5.3 – Bald

Powiązane problemy