2011-07-04 8 views
8

Używam preg_replace_callback znaleźć i zastąpić linki tekstowe z żywymi linki:preg_replace_callback() Problem

http://www.example.com 

do

<a href='http://www.example.com'>www.example.com</a> 

Funkcja zwrotna mam realizowanie funkcji ze jest w innym klasa, więc gdy próbuję:

return preg_replace_callback($pattern, "Utilities::LinksCallback", $input); 

Występuje błąd informujący, że funkcja nie istnieje. Jakieś pomysły?

+1

'Utilities :: LinksCallback' nie istnieje. –

+0

Niekoniecznie. Nie możesz przekazać takiego łańcucha oddzwaniania we wszystkich wersjach PHP. –

Odpowiedz

20

W PHP przy użyciu metody klasy jako wywołania zwrotnego, należy skorzystać z formularza array wywołania zwrotnego. Oznacza to, że tworzymy tablicę, której pierwszym elementem jest klasa (jeśli metoda jest statyczna) lub instancja klasy (jeśli nie), a drugim elementem jest funkcja do wywołania. Na przykład.

class A { 
    public function cb_regular() {} 
    public static function cb_static() {} 
} 

$inst = new A; 

preg_replace_callback(..., array($inst, 'cb_regular'), ...); 

preg_replace_callback(..., array('A', 'cb_static'), ...); 

Funkcja, do której dzwonisz, oczywiście musi być widoczna z zasięgu, w którym używasz wywołania zwrotnego.

Aby uzyskać szczegółowe informacje na temat prawidłowych połączeń zwrotnych, patrz: http://php.net/manual/en/language.pseudo-types.php.

N.B. Czytanie tam, wydaje się, że od 5.2.3, możesz użyć swojej metody, o ile funkcja wywołania zwrotnego jest statyczna.

+0

Tak, dziękuję. Mój kod powinien być poprawny zgodnie z metodą, którą używa PHP.net, chociaż ich przykład jest podobny, używają zwykłej funkcji - a nie metody statycznej klasy. Edycja: problem polegał po prostu na pominięciu słowa kluczowego static. – Lee

+2

Brakowało mi NB, co było moim problemem. FYI - jeśli używasz w instancji klasy, 'tablica ($ this, 'nazwa_metody')" robi lewę. – benmarks

4

Można to zrobić tak:

return preg_replace_callback($pattern, array("Utilities", "LinksCallback"), $input) 

referencyjny: http://php.net/callback

+1

Nie wiem o funkcjach statycznych, więc powyższe rozwiązanie może być poprawne. Ale jeśli jest to zwykła funkcja, użyj tego: 'return preg_replace_callback ($ pattern, array (& $ this," LinksCallback "), $ input);' –

+0

To z pewnością zadziała dla instancji. W przypadku funkcji statycznych wymagana jest moja notacja. Sądzę, że (Zend) zakładają, że większość odwołań do funkcji statycznych będzie dotyczyła klas statycznych. –

+0

Tak, funkcja LinksCallback() jest statyczna i znajduje się w narzędziach klasy. Spróbuję dzięki. – Lee