2012-03-03 33 views
13

Tôi đã nghiên cứu các câu hỏi tương tự, nhưng tôi vẫn chưa rõ ràng nếu có thể và/hoặc cách tốt nhất để chuyển các đối số bổ sung trong preg_replace_callback bằng PHP 5.2.6Gửi các đối số bổ sung cho preg_replace_callback bằng PHP 5.2.6

Trong trường hợp này, tôi cũng đang tìm cách chuyển khóa $ từ vòng lặp foreach cùng với hàm 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]; 
} 

Tự hỏi nếu một cái gì đó như thế này sẽ làm việc:

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

Chức năng Acallback bị đóng, bạn có thể chuyển thêm đối số thông qua sử dụng, vui lòng kiểm tra câu trả lời tại http://stackoverflow.com/questions/16445991/how-do-i-access-a-variable-inside-of-preg -replace-callback – Tester

Trả lời

28

Trước PHP 5,3

Bạn có thể sử dụng lớp helper:

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 

Kể từ PHP 5,3

Bạn có thể sử dụng chức năng ẩn danh:

$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

Cảm ơn, đây chính xác là những gì tôi đã hy vọng là có thể Đánh giá cao mẫu, nó rất rõ ràng và tôi đã có thể thích ứng với nó. – jsuissa

+1

Bất cứ ai đọc điều này: bạn có thể muốn sử dụng từ khóa 'use' thay vì cách tiếp cận tương đối phức tạp này (xem [câu trả lời này bởi @Mark Baker] (http://stackoverflow.com/a/16446110/722036) để biết thêm thông tin) –

+0

Câu trả lời trong phần bình luận ở trên từ @ TheSexiestManinJamaica cung cấp giải pháp tốt hơn và đơn giản hơn cho vấn đề này hơn là thêm lớp mới v.v. – Chris

2

Đáng tiếc là bạn không thể. Trong PHP 5.3, bạn có thể chỉ cần sử dụng một bao đóng để có quyền truy cập vào các biến mà bạn truyền qua làm tham số.

Trong trường hợp của bạn, có hai giải pháp khả thi: Một giải pháp sạch và bẩn.

Thiết bị bẩn đang lưu trữ các tham số trong các biến toàn cầu để bạn có thể truy cập chúng từ bên trong gọi lại.

Chế độ sạch sẽ tạo lớp học trong đó bạn chuyển các thông số, ví dụ: thông qua hàm tạo. Sau đó, bạn sử dụng array($instance, 'methodName') làm gọi lại và chỉ cần truy cập thông số qua $this->whatever bên trong phương thức của mình.

+0

Cảm ơn điều đó đã giúp tôi đi đúng hướng. Tôi đã cập nhật câu hỏi dựa trên nhận xét của bạn, tôi tin rằng tôi hiểu những gì bạn đang đề xuất. – jsuissa

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

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

}, $content); 
+2

hoạt động trong php 5.3 – Bald

Các vấn đề liên quan