Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl


zimi
Napisane: 28.02.2009, 19:54:36





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

exit raczej zabija skrypt...
zamiast exit zrób return

a tak przy okazji następnym razem wrzuć kod w znaczniki [ php ] a nie [ code ]
i nastawiaj kilka flag wewnątrz funkcji żeby sprawdzić co w niej nawala
  Forum: PHP · Podgląd postu: #577755 · Odpowiedzi: 2 · Wyświetleń: 695

zimi
Napisane: 22.09.2008, 16:21:27





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

dorzuce może jeszcze swoje 3 grosze, w niektórych rozwiązaniach jest sugestia aby korzystać z określonego rozszerzenia np. class.php, że nazwa klasy była taka sama jak pliku, żeby ...

Ja zrobiłem klasę która mapuje wskazany katalog, z opcjonalną flagą o rekursywności mapowania:
tak wygląda przykładowy kod wykorzystujący klasę mapowania
  1. <?php
  2. require_once'core/MapaKlas.php';
  3. $obiekt = new MapaKlas();
  4. $obiekt->szukaj('.', FALSE);
  5. $obiekt->szukaj('core/');
  6. $obiekt->szukaj('modele/');
  7. $obiekt->szukaj('modul/');
  8. $obiekt->generujPlik();
  9. ?>

Tym kodem mapujemy zawartość wszystkich plików w katalogu głównym i rekursywnie wszystkie pliki w katalogach core, modele, modul i sprawdzamy tokenizerem PHP czy w pliku są klasy PHP i ew. jakie, tworząc tablicę asocjacyjną i generując całą klasą autoloadera... Tu w sumie trochę przesadziłem lepiej by chyba było serializować i odserializować dane w autoloaderze, ale zrobiłem jak zrobiłem

taki był mój pomysł, obróka tokenizerem nie była trudna, a dzięki niej jesteśmy niezależni czy ktoś ma jakieś swoje rozszerzenie php5, php6, php, php_cokolwiek biggrin.gif:P, czy ma 2 klasy w pliku czy cokolwiek innego, wszystko wyciąga tokenizer i przyporządkowuję klasę do pliku

Kod nie jest piękny, dość bałaganiarski tak mi się wydaję..., ale jeśli ktoś jest zainteresowany to podrzucę (możnaby rzec: mi działało smile.gif ), chciałem jedynie zasygnalizować ideę..., ja chwilowo staram się pracować z symfony więc klasy nie rozwijałem...
  Forum: Object-oriented programming · Podgląd postu: #518748 · Odpowiedzi: 27 · Wyświetleń: 4 450

zimi
Napisane: 5.08.2008, 13:36:44





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

w kodzie wygląda że masz funkcje napisane przez tego kogoś do kodowania jak i odkodowania w pliku encdec.php co sugerowałaby sama nazwa...

zapisz do pliku kod i odpal:
  1. <?php
  2. $obiekt = new EncDec();
  3. echo $obiekt->enc($obiekt->dec('wiadomosc'));
  4. ?>

jeśli wyświetli się 'wiadomosc' to znaczy że to są funkcje do odkodowania i zakodowania i że działają smile.gif
skróty enc i dec wskazują że te funkcje właśnie do tego służą smile.gif
  Forum: PHP · Podgląd postu: #501503 · Odpowiedzi: 7 · Wyświetleń: 1 588

zimi
Napisane: 10.01.2008, 15:45:25





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

tzn. Twoja forma tłumaczenia do mnie nie dociera (nie mniej wydaję mi się że bardzo źle zinterpretowałeś), ogólne założenie że rekurencja działa od środka jest mylne
jak wywołujesz rekurencje w swoich programach to masz coś a'la
  1. <?
  2. function foo()
  3. {
  4. //jakiś kod
  5. if(...)
  6. {
  7.  //jakiś kod
  8.  foo();
  9.  //jakiś kod
  10. }
  11. //jakiś kod
  12. }
  13. ?>

więc działa od zewnątrz wgłąb(sic!) a nie od środka na zewnątrz
jak nie miałeś doczynienia z rekurencją to zobacz na wikipedii... => odrób lekcje smile.gif
czyli analizując moją regexp:
Kod
@<div>(?(?=</?div>)(?R)|.)+</div>@

@<div> - wiadomo...
(?(?=</?div>)(?R)|.) dla uproszczenia => (?(a)b|c)
w takiej postaci to znaczy jeśli a to dopasuj b w przeciwnym wypadku c
a => (?=</?div>)
b => (?R)
c => .
w wyrażeniu sprawdzającym chyba najczęściej używa sie asercji
Cytat
Kolejna część ma się równać </?div> natomiast w tym znak zapytania sprawdza czy zostało dopasowane </ i jeśli tak każe kontynuować

chciałbym szczególną uwagę zwrócić na słowo dopasowane... w regexp kojarzy się ono z tym że jak to uroczo jest w dokumentacji opisane regexp "skonsumował" jakiś ciąg
tutaj jednak mamy doczynienia z asercją, asercja sprawdza co jest w odpowiednim miejscu (zależnie od tego jakiej asercji użyjemy) jednak jej nie konsumuję...
prosty przykład
  1. <?php
  2. preg_match("@^(?=a)b$@", "ab");
  3. ?>

zwróci false bo asercja nie dopasuję "a", a jedynie sprawdzi czy "a" znajduję się w żądanym przez asercje miejscu

rekurencje już opisałem... może niezbyt wyraźnie...
Cytat
co do (?R) to jest to rekurencyjne zagnieżdżenie, teoretycznie to wygląda tak że cały zewnętrzny wzorzec (jeśli się nie mylę) powinien zostać wpisany w miejsce (?R)

a zatem jeśli w regexp znajdzie się (?R) to parser (czy interpreter... nie wiem jak się przyjęło to nazywać) będzie dopasowywał od początku wyrażenie regularne...
może przykład
Cytat
<div>bb<div>bbbb</div><div>b<div>bbbb</div>bbb</div>bb</div>

wyrażenie dopasuje <div> tak jak to stwierdziliśmy i ponieważ dalej od miejsca w którym zaczyna nie widzi <div> lub </div> dopasowuję w kółko jeden jakikolwiek znak...
gdy zobaczy <div> to ten fragment jest jakby odcinany i dopasowuję do niego od nowa całego regexp-a
więc wycina sobie pogrubiony fragment:
Cytat
<div>bb<div>bbbb</div><div>b<div>bbbb</div>bbb</div>bb</div>

i niejako sam w sobie robi:
  1. <?
  2. preg_match("@<div>(?(?=</?div>)(?R)|.)+</div>@","<div>bbbb</div>");
  3. ?>

tutaj bez problemu przechodzi po kolejnych "b" dopasowując po jednej literce
a dalej napotyka problem bo mimo że ma dopasować jakąkolwiek literkę to nie może tego zrobić gdy ta literka zaczyna ciąg: </div>
więc "+" zakończył swoje działanie i dopasowywany jest </div> z końcówki wyrażenia
po czym wyskakuje z niego na wyższy poziom i dopasowuję reszte która mu została z całości:
Cytat
<div>bb<div>bbbb</div><div>b<div>bbbb</div>bbb</div>bb</div>

mam nadzieję że dość jasno wytłumaczyłem...

zakończyłem swój wykład o regexp smile.gif może kiedyś napiszę kurs bo jest słabo opisany w sumie
jednak polecam przyswoić dokumentacje do której jest link w manualu PHP
  Forum: PHP · Podgląd postu: #428795 · Odpowiedzi: 7 · Wyświetleń: 2 053

zimi
Napisane: 10.01.2008, 00:01:42





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

Kod
(?>[^<]*)

"znaczy połknij wszystkie znaki różne od < i nie oddawaj" smile.gif
przetestuj:
  1. <?
  2. echo preg_match("@(?>a+)ab@","aaab");
  3. echo preg_match("@(?>a+)b@","aaab");
  4. echo preg_match("@a+ab@","aaab");
  5. ?>

podobną właściwość... to jest w sumie chyba równoważne... a jak nie jest to nie wiem czym się różni będzie miało
  1. <?
  2. echo preg_match("@(?>a++)ab@","aaab");
  3. ?>

regexp jak znajdzie "a+" we wzorcu to najpierw łyka wszystkie "a" które spotka, ale jak się okaże że zaraz po "a+" jest potrzebne "a", to jedno "a" "wypluje" z powrotem, aby można było resztę wzorca dopasować
a++ jak i (?>a+) czy analogiczne konstrukcje nie pozwalają "wypluwać"
mam nadzieje że dość jasno to opisałem.. starałem się...
co do (?R) to jest to rekurencyjne zagnieżdżenie, teoretycznie to wygląda tak że cały zewnętrzny wzorzec (jeśli się nie mylę) powinien zostać wpisany w miejsce (?R)
czyli jeśli twój wzorzec ma postać (to jedynie postać schematyczna... nie ma prawa działać...):
Kod
foo(?R)bar
no to to się rekurencyjnie zagłębia w siebie
Kod
foofoofoofoo(?R)barbarbarbar
itp.
w dokumentacji wyrażeń regularnych jest to dość słabo opisane i może dlatego nie udało mi się napisać regexp-a rekurencyjnego który by działał tak jak bym tego chciał... (trochę to pogięte... albo ja jestem głupi smile.gif )
co do "wykorzystania w przeczeniu całej frazy" to tutaj używamy asercji negatywnych "patrzących do przodu"
  1. <?php
  2. echo preg_match("@^(?!Jestem głupi).+$@","Jestem głupi");
  3. ?>

mimo że pozwalam pojawić się wszystkim znakom => .+
To i tak nie dam sobie wmówić że jestem głupi biggrin.gif:P
generalnie polecam przeczytać dokumentację regexp (w sumie 16 stron) dość dobrze napisana (tylko ta rekurencja jakoś średnio...)
najgorsze jest że wszystko jest podobne a mamy wyrażenia warunkowe, 4 rodzaje asercji, rekurencje, różne operacje na podciągach ciężko zapamiętać jak to się oznacza wszystko smile.gif
co do x masz rację... tutaj autor rozdzielał wszystko spacjami dla łatwiejszego czytania tych wszystkich nawiasów...
jak wywalisz spacje to możesz również wywalić x

PS. jak odkryjesz zasadę działania rekurencji we wzorcu to możesz to opisać smile.gif będę wdzięczny smile.gif

EDIT: męczyłem, męczyłem i wymęczyłem, to działa chyba jak kod który podałeś
  1. <?php
  2. $str = "<div>bbdiv>bbbb</div><div>b<div>bbbb</div>bbb</div>bb</div>";
  3. preg_match_all("@<div>(?(?=</?div>)(?R)|.)+</div>@",$str, $match);
  4. var_dump($match);
  5. $out2 = ob_get_contents();
  6. echo'<pre>';
  7. ?>
  Forum: PHP · Podgląd postu: #428595 · Odpowiedzi: 7 · Wyświetleń: 2 053

zimi
Napisane: 8.01.2008, 00:35:54





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

hmmm wprawdzie nie słyszałem o takiej opcji...
no ale jeśli chodzi o to kto pobrał dany obrazek no to tu można rozstrzygnąć adresując każdemu użytkownikowi obrazek inaczej
czyli jeden dostanie obrazek na adres http://example.com/images/user1.jpg
gdzie user1 byłbym jakimś kodem zapisanym w bazie jak np. na YT
a całość na serwie mogła by być przekierowana na jeden plik... mod_rewrite... etc

czyli:
1. generujesz maila z tokenem
2. wybierasz użytkownika z bazy
3. przypisujesz tokena użytkownikowi w bazie
4. wysyłasz maila
5. mail jest odebrany -> żąda obrazka z tokenem w nazwie z Twojego serwa
6. sprawdzasz w bazie komu przypisany był token
7. wysyłasz obrazek stały dla wszystkich
8. wiesz kto odebrał...

całość działa na generowaniu linków aktywacyjnych do rejestracji w danym serwisie
wyniki mogą być zafałszowane ze względu na to że nie wszystkie klienty mogą obsługiwać HTML
  Forum: PHP · Podgląd postu: #427796 · Odpowiedzi: 1 · Wyświetleń: 780

zimi
Napisane: 7.01.2008, 19:15:48





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

nie bardzo wiem co wykombinowałeś w kodzie z tego co wiem preg_match nie ma prawa zmienić stringa...
może używasz preg_replace...
jak sobie poradzić: w wyrażeniach regularnych masz możliwość podawania kodów w zapisie hex danych znaków...
możesz je wypisać w ten sposób... doczytaj w dokumentacji regexp zalinkowanej w dokumentacji PHP

co do offtopica to nie odrobiłeś zadania domowego... bo jest również mb_strlen... o której nie przeczytałeś...
UTF ma pewną swoją składnie... i często składa się z 2 bajtów które są interpretowane jako 1 znak
strlen nie wnika w kodowanie i widzi tylko pojedyncze znaki...

PS. odrób lekcje: wiki -> UTF, manual PHP, dokumentacja regexp winksmiley.jpg
  Forum: PHP · Podgląd postu: #427666 · Odpowiedzi: 6 · Wyświetleń: 1 443

zimi
Napisane: 7.01.2008, 18:47:07





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

zauważ że jest funkcja: mb_strtoupper" title="Zobacz w manualu PHP" target="_manual która jako drugi parametr przyjmuję kodowanie... czyli prawdopodobnie strtoupper nie jest pod tym względem zbyt bezpieczne...
[m]preg_match[\m] zasadniczo nie zmienia zawatości stringa, sprawdza ona tylko zgodność w regexp i wyszukuję ew. podciągów... więc ze zmianą zawartości ma raczej niewiele wspólnego...
ale dla pewności sprawdź co będzie gdy preg_match wyłączysz a strtoupper zostawisz i na odwrót...
prawdopodobnie musisz użyć [m]mb_strtoupper[\m], ale ponieważ z tego co mówiłeś to nie masz tej funkcji (ani cąłej biblioteki)... no to jakiś odpowiednik musisz zaimplementować
  Forum: PHP · Podgląd postu: #427651 · Odpowiedzi: 6 · Wyświetleń: 1 443

zimi
Napisane: 6.01.2008, 18:34:24





Grupa: Zarejestrowani
Postów: 233
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----

generalnie z tego co widzę jeśli masz formularz w jakimś kodowaniu (w tym wypadku UTF-8) i skopiujesz do niego jakąś zawartość to przeglądarka zadba o to żeby doszło to do Ciebie już w UTF
(z tym że przeglądarka wie z nagłówków strony jakie kodowanie miała i jakie ma dostarczyć)

ja wziąłem swoją stronkę w UTF i wpisałem coś z jakieś francuskiej strony z ISO-8859-1 i nie pokazały mi się szlaczki
przeglądarka o to zadba gdy w kodowaniu z Twojej strony będą odpowiednie znaczki...

co do samego wykrywania kodowania na podstawie tekstu..., funkcja którą podałeś mb_detect_encoding" title="Zobacz w manualu PHP" target="_manual,
jako parametr przyjmuję listę języków, aby wiedzieć co najpierw za kodowanie ma wypluć... stąd wniosek że one magicznie nie stwierdzą Ci co to było za kodowanie z całą pewnością
więc tak naprawdę wiesz niewiele
o ISO wiesz że znaki od 7F do 9F są nieużywane... więc jeśli pojawi Ci się jakiś znak o kodzie w tym zakresie to wiesz że to nie iso...
ale rozpoznać kodowań ISO między sobą już właściwie nie masz szans... musiałbyć mieć słowniki różnych języków i sprawdzać czy kolejne słowa tekstu się w nim znajdują (mając przy tym nadzieje że ludzie piszą bez błędów ortograficznych)
ogólnie moim zdaniem nie ma tutaj zbyt wiele pola do popisu
  Forum: PHP · Podgląd postu: #427282 · Odpowiedzi: 6 · Wyświetleń: 1 443


New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 01:40