Zamiana preg_replace na preg_replace_callback Skip to content →

Zamiana preg_replace na preg_replace_callback

Funkcja preg_replace służy do podmiany podciągów ciągu znaków na podstawie wyrażeń regularnych. Język PHP został dodatkowo wyposażony w modyfikator /e. To dzięki niemu mieliśmy możliwość wykonywania dodatkowych funkcji na dopasowanym ciągu np. strtoupper. W wersjach od 5.5.0 modyfikator ten został oznaczony jako DEPRECATED, a w 7.0.0 i wyższych usunięty.

PHP w wersji < 5.5.0

Zacznijmy od przykładu:

Wynikiem wykonania poniższego skryptu będzie ciąg:

Każde wystąpienie aaa  zostało zamienione na (aaa), a na ciągu bbb  została wykonana funkcja strtoupper, co w rezultacie dało  BBB .

Usuwając z 10 linii modyfikator e  orzymamy:

Jak widać, brak modyfikatora e  spowodował, że zapis strtoupper('$0')  został potraktowany jako zwykły ciąg znaków.

PHP w wersji >= 5.5.0

Próba wykonania powyższego kodu na wersjach >= 5.5.0 będzie skutkowała otrzymaniem komunikatu:

Jeżeli polegaliśmy na wykonywaniu dodatkowych funkcji na wyszukanym ciągu to musimy znaleźć inne rozwiązanie. Komunikat proponuje nam użycie funkcji preg_replace_callback. Rzućmy okiem na sygnaturę tej metody:

Z powyższego wynika, że nie możemy po prostu zamienić nazwy. Pierwszy argument przeznaczony został na wyrażenia regularne, natomiast drugi na funkcję callback, czyli taką, która zostanie wykonana po dopasowaniu ciągu znaków. Możemy przekazać tylko jedną taką funkcję – jeżeli chcemy każde z wyrażeń obsługiwać w inny sposób, musimy ich mieć kilka.

Rozwiązanie powyższego problemu okazuje się bardzo proste:

Wszystkie wyrażenia regularne oraz odpowiadające im funkcje anonimowe zagregowaliśmy w jednej tablicy. Następnie iterując po wspomnianej tablicy obieg po obiegu podmieniamy interesujące nas ciągi znaków otrzymując taki sam wynik jak w przypadku kodu pierwszego.