środa, 30 stycznia 2013

sed - zamiana zmiennych w kodzie PHP

Dostałem dziś źródła aplikacji PHP napisaną przez znajomego, który poprosił mnie abym wszystkie zmienne $_POST w jego kodzie szybko zwalidował, sparsował czy jak to inaczej nazwać :) Napisanie, funkcji nie było problemem. Problemem było jak to szybko zamienić w dziesiątkach plików źródłowych :)

Z pomocą przyszedł sed i jedna z najpopularniejszych powłok systemów uniksowych ;)




TMPFILE=./tmp.$$

for filename in *.php; do
        sed -r 's/\$_POST\[(.*)\]/check($_POST\[\1\])/' $filename > $TMPFILE
            mv $TMPFILE $filename # original file.
done


Może pokrótce opiszę samo polecenie sed:

-r - dzięki przełącznikowi, możemy używać rozszerzonych wyrażeń regularnych (extended regular expressions)
(.*) - grupa dowolnych znaków
\1 - grupa wyszukanych dowolnych znaków  - (.*) -  czyli wszystko to co zostało wyszukane jako część zmiennej $_POST[dokładnie_to]

Dzięki powyższemu ze wszystkim uporałem się w kilka minut.

Po konsultacji przykładu ze znajomym, lepszym pomysłem okazało się zastosowanie array_map w  PHP, które pozwoliło na parsowanie wszystkich zmiennych $_POST jedną linijką :)

$_POST = array_map('check', $_POST);

Powyższą linijkę należy wkleić na samym początku aplikacji (index.php, head.php lub pliku z funkcjami - funkcje.php itp.) tak aby przerobić to na samym początku.