![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Piszę sobie teraz coś w stylu edytora konfiguracji, który bazuje na czystym źródle.
I na tego typu kawałkach kodu grzęznę. Wszystko by było ok, gdyby nie było subtablic. Traktować tego eval" title="Zobacz w manualu PHP" target="_manualem nie chcę, nie mam pomysłu na to, aby zrobić z tego uzyteczną tablicę, np: Kod k1=>v1 k2=>v2k1=>v2v1 v2k2=>null Myślałem, żeby przetworzyć to jak XML, ale tam są przecież nazwy znaczników na początku i na końcu bloku, a tu tylko nawias. Przyszedł mi jeszcze do głowy pomysł, żeby robić stosy przez nawiasy otwierające/kończące, ale to IMHO niezbyt dobre rozwiązanie, bo wystarczy dać (2+2) jako wartość i już się sytuacja komplikuje... (IMG:http://forum.php.pl/style_emoticons/default/blink.gif) Ma ktoś jakieś pomysły? Ślęczę nad tym już ładny kawałek czasu i nijak nie mogę tego rozgryźć... (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem czy rozumiem problem. Ja zrobiłbym to rekurencyjnie na zasadzie preg_match_callback(). To co pasuje do wzorca, zapisujemy w tymczasowej tabeli i podmieniamy na coś w stylu !!1!!, gdzie liczba w środku to klucz tablicy tymczasowej z elementem oryginalnym. Jako dopasowanie bierzesz tylko zmienną lub array(!!x!!); (oczywiście te !!x!! możesz tymczasowo wycinać, lub szukać dopasowania do array\(!![0-9]*!!\) i też podmieniać) w sensie zawartość musi być sparsowana wcześniej. Jak już masz to rozbite na elementy pierwsze to już sobie sprawdzasz co jest co.
Pozdrawiam! |
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Też mi coś takiego po głowie chodziło, ale załóżmy taki przypadek:
i już się sytuacja komplikuje, bo gdyby jako "klamr" prega użyć array( i ), to wtedy "łapie" za nie ten nawias, co trzeba... ;/ |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
może to Ci coś pomoże: bedkowski.pl
|
|
|
![]()
Post
#5
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
A może, tak dla odmiany, skorzystaj z Yaml? http://www.yaml.org/
A tu przykład możliwości: http://www.symfony-project.org/book/1_0/01...ng-Symfony#YAML |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 181 Pomógł: 18 Dołączył: 19.04.2008 Ostrzeżenie: (10%) ![]() ![]() |
dosc pokretne
gdybys napisal jasniej co chcesz osiagnac z jakiego typu konfiguracji to moze.. a jesli chodzi o "to wtedy "łapie" za nie ten nawias, co trzeba... ;/" zainteresuje sie zachlannoscia wyrazen regularnych |
|
|
![]()
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Cytat i już się sytuacja komplikuje, bo gdyby jako "klamr" prega użyć array( i ), to wtedy "łapie" za nie ten nawias, co trzeba... ;/ Wcale nie bo pattern złapie tylko (pomijając zmienne) array(!!13!!) czyli cała zawartość nawiasu musi być wcześniej sparsowana. jeżeli wygląda to tak: Kod array( a=> array (a=> 1)); Najpierw podmieni " a => 1" na !!1!! i mamy: Kod array(a=> array(!!1!!)) array(a=> !!2!!) array(!!3!!) !!4!! Pozdrawiam |
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat A może, tak dla odmiany, skorzystaj z Yaml? http://www.yaml.org/ http://www.zyxist.com/pokaz.php/formaty_danych_benchmark ... Z plikami ini na razie się wstrzymuję. Cytat gdybys napisal jasniej co chcesz osiagnac z jakiego typu konfiguracji to moze.. Ok, napiszę najprościej, jak tylko potrafię - ze względu na wydajność, chcę trzymać konfigurację bezpośrednio w kodzie, w tablicach. Dlaczego? Otóż, zależy mi na kompromisie między wydajnością a wygodą w przypadku ręcznej edycji, jeśli by to było konieczne. Docelowo, pliki mają być także edytowalne za pomocą inspektora napisanego w PHP. Rozwiązania SGML-owe odpadają z powodu wydajności, zserializowane tablice raczej ciężko jest bezpośrednio edytować, w plikach ini trochę ciężko z wielowymiarowością (choć wcale nie twierdzę, że jest to niemożliwe) i trzeba kombinować z wyrażeniami/stałymi/etc. Bardzo zależy mi na w miarę czytelnym rozwiązaniu, ale jednocześnie takim, które będzie najwydajniejsze. Więc klasyczne tablice są IMHO najbardziej kompromisowym rozwiązaniem tym bardziej, że mogę sobie plik przepuścić przez osobną instancję parsera, aby go ewentualnie zwalidować. No i do czego piję - czasem zajdzie potrzeba zmodyfikowania jakiegoś pliku konfiguracyjnego "przez automat" i tu zaczynają się schody. Owszem, mogę wszystko potraktować evalem albo po prostu zainclude'ować, ale wtedy do widzenia mówię nazwom stałych/funkcji/wyrażeń użytych do pozyskania wartości. Chcę tak jakby evalować ten kod (tylko jako strukturę) zachowując deklarację wartości (oprócz array, bo one odpowiadają za strukturę). Cytat zainteresuje sie zachlannoscia wyrazen regularnych Cały czas próbuję coś modzić; założyłem ten temat po n-dziesięciu podejściach... Łącznie z przeglądaniem źródeł samego interpretera (sic!)... ayeo, a mógłbyś pokazać przykładowy sposób zaimplementowania? W znacznikowych, to no problem, bo idzie po znacznikach, a tu jakoś nie mam już pomysłu... (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 181 Pomógł: 18 Dołączył: 19.04.2008 Ostrzeżenie: (10%) ![]() ![]() |
W czym problem z wydajnoscia ?
Mam 1 typ configu w XML z wlasnym parserem w obie strony, czyli save i load z pelna edycja przez CMS - wyrazenia regularne oczywiscie, drugi taki sam na *.ini. Wrazenie wygody trzymania w a'la code jest tylko wrazeniem moim zdaniem. Regexem wyciagniesz i nazwy zmiennych i dane, wstawisz je w obiekt z nazwami wlasciwosci takimi jak w pliku - czyli dynamicznie tworzonymi, dostepnymi jak uwazasz albo przez prop[name]=val albo prop->name. Zaleta jest taka, ze ini i xml sa do tego powszechnie stosowane, wiec nauczysz sie czegos uniwersalnego a i modyfikacja nie tylko przez ciebie jest latwiejsza do zrozumienia dla ewentualnego uzytkownika, a parser do kodu bedzie raczej srednio uniwersalny. Pewnie, ze mozna. |
|
|
![]()
Post
#10
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat W czym problem z wydajnoscia ? Zamieściłem link do benchmarka poszczególnych sposobów zapisu. Napisać parser do XML/INI, to nie problem, ale chcę na razie wyczerpać wszystkie możliwe sposoby... |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 7 Dołączył: 4.05.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli trzymanie danych konfiguracyjnych w postaci czystego PHP nie jest warunkiem koniecznym, to zainteresuj się formatem JSON (http://www.json.org/). Jest znacznie wygodniejszy w użyciu (do tego celu) niż XML - przypomina zserializowaną tablicę, lecz jest prostszy i przyjemniejszy dla oka (co ważne w przypadku ręcznej edycji!).
W PHP >= 5.2.0 masz do dyspozycji f-cje json_encode/json_decode - jeżeli korzystasz ze starszej wersji, możesz skorzystać z PECL-a: http://pecl.php.net/package/json. Jeżeli pozostaniesz przy czystem PHP-ie, to nie ma sensu unikać eval'a, bo skończysz na napisaniu od zera własnego parsera PHP, który z definicji będzie miał wszystkie te same wady (np. bezpieczeństwo), lecz w przeciwieństwie do parsera Zenda nie będzie miał za sobą kilkunastu lat debugowania i rozwijania przez środowisko open source. JL |
|
|
![]()
Post
#12
|
|
Grupa: Przyjaciele php.pl Postów: 384 Pomógł: 6 Dołączył: 11.09.2004 Skąd: Grodzisk Mazowiecki Ostrzeżenie: (0%) ![]() ![]() |
Zamieściłem link do benchmarka poszczególnych sposobów zapisu. Napisać parser do XML/INI, to nie problem, ale chcę na razie wyczerpać wszystkie możliwe sposoby... No ok. Zyx pokazał co szybkie co wolne, ale ... przecież wszyscy wiedzą że różnorodne parsowania są wolne. Dlatego też wybierasz sobie format, parsujesz, robisz cache i z głowy problem wydajności. |
|
|
![]()
Post
#13
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
No to wiadomo, że wszystko jest parsowane - nawet zdania, które wypisujemy. ;P
Cache, cache - ale po co sobie dorabiać więcej roboty, skoro można prościej...? W sumie, podłubałem, podłubałem, idea Ayeo była najbliższa, także podsunął mi potem kilka sugestii (fakt, na pregach, ale... ;]). Skończę usprawniać ten kod, co udało mi się już otrzymać i wkleję dla potomnych. ;] PS. Nie popełniajcie kolejny raz tego samego głupiego błędu, co ja: 3. parametr substr" title="Zobacz w manualu PHP" target="_manual, to length, a nie drugi offset... :S Ten post edytował erix 5.05.2008, 19:38:38 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 09:21 |