2012-03-03 3 views
13

Я изучаю подобные вопросы, но я все еще немного неясен, если это возможно и/или лучший способ передать дополнительные аргументы в preg_replace_callback с помощью PHP 5.2.6Передача дополнительных аргументов для preg_replace_callback с использованием PHP 5.2.6

В этом случае я также хочу передать ключ $ из цикла foreach на функцию 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]; 
} 

Хотите знать, если что-то подобное будет работать:

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

Функция Acallback - это закрытие, вы можете передать дополнительные аргументы с помощью использования, пожалуйста, проверьте ответ на http://stackoverflow.com/questions/16445991/how-do-i-access-a-variable-inside-of-preg -replace-callback – Tester

ответ

28

Перед PHP 5.3

Вы можете использовать вспомогательный класс:

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 

Начиная с PHP 5.3

Вы можете использовать анонимную функцию:

$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

Спасибо, это именно то, чего я надеялся, было возможно. Оцените образец, это очень ясно, и я смог его адаптировать. – jsuissa

+1

Кто бы это ни читал: вы можете использовать ключевое слово 'use' вместо этого относительно сложного подхода (см. [Этот ответ by @Mark Baker] (http://stackoverflow.com/a/16446110/722036) для получения дополнительной информации) –

+0

Ответ в комментарии выше от @TheSexiestManinJamaica предлагает гораздо лучшее и более простое решение этой проблемы, чем добавление новых классов и т. Д. – Chris

2

К сожалению, вы не можете. В PHP 5.3 вы можете просто использовать закрытие, чтобы иметь доступ к переменным, которые вы передавали в качестве параметров.

В вашем случае есть два возможных решения: чистый и грязный.

Грязный хранит параметры в глобальных переменных, поэтому вы можете получить к ним доступ изнутри обратного вызова.

Чистый создает класс, в котором вы передаете параметры, например. через конструктор. Затем вы используете array($instance, 'methodName') в качестве обратного вызова и просто получаете доступ к параметрам через $this->whatever внутри вашего метода.

+0

Спасибо, что я пошел в правильном направлении. Я обновил вопрос на основе вашего комментария, я считаю, что понимаю, что вы предлагаете. – jsuissa

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

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

}, $content); 
+2

работает в php 5.3 – Bald

Смежные вопросы