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 đó.
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