9

mmmh guys, tôi thực sự hy vọng tiếng anh của tôi là tốt enaught để giải thích những gì tôi cần.Có cách nào để chuyển một tham số khác trong hàm gọi lại preg_replace_callback không?

Cho phép thực hiện việc này dụ (có nghĩa là chỉ là một ví dụ!) Mã:

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

Vì vậy, hướng dẫn php nói rằng để sử dụng một phương pháp học như callback trong preg_replace_callback(), phương pháp này phải trừu tượng .

tôi cần phải vượt qua một thể hiện của một đối tượng previuosly khởi tạo (trong ví dụ này, một thể hiện của lớp Something) tại hàm callback.

Tôi đã cố gắng sử dụng call_user_func(), nhưng không hoạt động (vì theo cách này tôi bỏ lỡ thông số matches).

Có cách nào để thực hiện điều đó hay không để tách quy trình (thực hiện trước preg_match_all, cho mỗi kết quả truy lục giá trị thay thế và sau đó đơn giản preg_replace)?

chỉnh sửa: như một phụ lưu ý, trước khi trả lời tom Haigh, tôi sử dụng này làm việc xung quanh (trong ví dụ này, đây là Replace phương pháp):

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

Hy vọng có thể giúp đỡ một ai đó.

Trả lời

13

Thật khó có thể vượt qua đối số callbacks, nhưng thay vì điều này:

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

Bạn có thể làm Bar() không tĩnh, và sử dụng này:

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

Sau đó, chức năng gọi lại sẽ có thể để xem $this

Xem 'gọi lại' trong Pseudo-types and variables

Cũng bằng PHP> = 5.3, bạn có thể sử dụng anonymous functions/closures để chuyển dữ liệu khác đến các hàm gọi lại.

+0

Công trình này! Tôi nghĩ rằng phương pháp lớp học phải là tĩnh, không nhớ nơi tôi đã đọc nó ..có lẽ tôi đã không làm gì cả và tôi lộn xộn với một số câu. Cảm ơn – Strae

12

Tôi gặp khó khăn khi cố gắng chuyển một đối số (tham số bổ sung) đến một cuộc gọi lại bằng phương thức create_function() và call_user_function().

này mang tính tham khảo:

<?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

nên lưu ý từ khóa 'use' đã được thêm vào trong PHP 5.4. hầu hết các máy chủ vẫn đang chạy 5.3 :( – mpen

+1

@Mark các từ khóa 'use' được thêm vào trong PHP5.3 –

+0

@WouterJ: đúng, nhưng chúng đã thêm' $ this' support vào 5.4? – mpen

0

vâng tôi sử dụng một cái gì đó như thế này để thiết lập và unset một biến thay đổi sao cho nó có sẵn cho các chức năng gọi lại và bạn không cần php mới hơn để làm điều đó:

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

sau đó trong chức năng gọi lại $ this -> _ current_key có sẵn:

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

    //and still remove found string 
    return ''; 
} 
Các vấn đề liên quan