Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Obcięcie znaków z końca
Forum PHP.pl > Forum > Przedszkole
mefjiu
Witam wyleciało mi z głowy jak nazywa się funkcja do wycinania znaków z końca gdy napotka znak podany w funkcji.

Chcę osiągnąć.

link
index.php?kategoria=true&site_no=2
lub
index.php?kategoria=true&site_no=99

sprowadzić do postaci
index.php?kategoria=true&site_no

Za wszelką pomoc z góry dzięki.
piotrooo89
w takim razie potrzebne Ci będzie explode bo znaki na końcu mogą być różniej długości.
mefjiu
Jeżeli ktoś zna prostrze rozwiązanie od tego:
  1. <?php
  2. echo substr($adres,0,strRpos($adres, "="));
  3. ?>

to prosze pisać
pyro
  1. <?php
  2. $replaced = preg_replace('|=[0-9]+|', '', $adres );
  3. ?>
bregovic
Pyro, nie chcę podważać, ale czy on na prawdę potrzebuje zaprzęgać do pracy wujka regexa w tym dość prostym przypadku? IMO jego rozwiązanie jest prostsze.
pyro
Cytat(bregovic @ 4.11.2008, 16:49:35 ) *
Pyro, nie chcę podważać, ale czy on na prawdę potrzebuje zaprzęgać do pracy wujka regexa w tym dość prostym przypadku? IMO jego rozwiązanie jest prostsze.


A czy ten regex jest skomplikowanym przypadkiem?
michalg
Cytat(pyro @ 4.11.2008, 12:06:48 ) *
  1. <?php
  2. $replaced = preg_replace('|=[0-9]+|', '', $adres );
  3. ?>


Ale to wytnie wszystkie wystąpienia, nie tylko ostatnie. Powinno być (dolar na końcu):

  1. <?php
  2. $replaced = preg_replace('|=[0-9]+$|', '', $adres );
  3. ?>
JoShiMa
i nie + (maksymalistyczny)
tylko +? (minimalistyczny)
michalg
Cytat(JoShiMa @ 4.11.2008, 17:25:08 ) *
i nie + (maksymalistyczny)
tylko +? (minimalistyczny)


Dlaczego?
pyro
Cytat(michalg @ 4.11.2008, 17:20:37 ) *
Ale to wytnie wszystkie wystąpienia, nie tylko ostatnie. Powinno być (dolar na końcu):

  1. <?php
  2. $replaced = preg_replace('|=[0-9]+$|', '', $adres );
  3. ?>

Och, zdawało mi się że go dałem na końcu, jednak autor podał konkretną sytuację w ktorej i tak nie mialoby to wiekszego znaczenia

Cytat(JoShiMa @ 4.11.2008, 17:25:08 ) *
i nie + (maksymalistyczny)
tylko +? (minimalistyczny)


(zgodnie z poprzednikiem) Niby dlaczego?
JoShiMa
Cytat(michalg @ 4.11.2008, 19:26:36 ) *
Dlaczego?


Dla porządku, choć w zasadzie przy założeniu że wycinamy tylko [0-9] nie ma to znaczenia. Gdybyś jednak chciał wyciąć wszystkie znaki znajdujące się za ostatnim znakiem równości i nie dał byś ograniczenia że to będą tylko cyfry to różnica między + a +? jest kolosalna, bo ten pierwszy wytnie wtedy wszystko co znajduje się między pierwszym znakiem równości a końcem linii a ten drugi wytnie wszystko co znajduje się między ostatnim znakiem równości a końcem linii. Taka jest różnica między maksymalistycznym a minimalistycznym kwantyfikatorem i lepiej od razu się do tego przyzwyczajać i nabierać dobrych nawyków.
bregovic
Pyro, nie chodzi mi o flame'a, ani o twojego regexa (który jest zrozumiały i w porządku) chodzi mi o fakt zaprzęgania silnika wyrażeń regularnych do bardzo prostej operacji na nieskomplikowanym stringu. IMO jeśli możesz coś zrobić funkcjami str* bez stawania na głowie powinieneś to zrobić funkcjami str*. Ale whatever floats your boat.
JoShiMa
Cytat(bregovic @ 4.11.2008, 19:33:43 ) *
[IMO jeśli możesz coś zrobić funkcjami str* bez stawania na głowie powinieneś to zrobić funkcjami str*.


Jakoś tak się ciągle słyszy, że preg_i są szybsze.

Ale tam zaraz flame. Merytoryczna dyskusja się rozwinęła. Niech się przedszkolaki uczą tongue.gif
pyro
Cytat(bregovic @ 4.11.2008, 17:33:43 ) *
Pyro, nie chodzi mi o flame'a, ani o twojego regexa (który jest zrozumiały i w porządku) chodzi mi o fakt zaprzęgania silnika wyrażeń regularnych do bardzo prostej operacji na nieskomplikowanym stringu. IMO jeśli możesz coś zrobić funkcjami str* bez stawania na głowie powinieneś to zrobić funkcjami str*. Ale whatever floats your boat.


bregovic, chciałem jeszcze dodać, że autor powiedział, że szuka innego rozwiązania poza tym, które podał. smile.gif

[offtopic]
Joshima, n/c, jak juz mnie nazywasz przedszkolakiem, to chociaz przedszkolakiem chodzącym do zerówki smile.gif
[/offtopic]
bregovic
Fakt, I seize my case - czepialski jestem z poranka winksmiley.jpg
michalg
Cytat(JoShiMa @ 4.11.2008, 17:33:24 ) *
Dla porządku, choć w zasadzie przy założeniu że wycinamy tylko [0-9] nie ma to znaczenia. Gdybyś jednak chciał wyciąć wszystkie znaki znajdujące się za ostatnim znakiem równości i nie dał byś ograniczenia że to będą tylko cyfry to różnica między + a +? jest kolosalna, bo ten pierwszy wytnie wtedy wszystko co znajduje się między pierwszym znakiem równości a końcem linii a ten drugi wytnie wszystko co znajduje się między ostatnim znakiem równości a końcem linii. Taka jest różnica między maksymalistycznym a minimalistycznym kwantyfikatorem i lepiej od razu się do tego przyzwyczajać i nabierać dobrych nawyków.


O tym wiem, tylko wydawało mi się, że w tym przypadku to nieistotne. Ale nie wiedziałem, że da się to tak zrobić - za pomocą operatora +? - myślałem, że steruje się tym tylko za pomocą modyfikatorów wzorców (U (PCRE_UNGREEDY)). Ale teraz widzę, że to po prostu zamienia maksymalistyczny na minimalistyczny i odwrotnie.

Ale faktycznie regexp do czegoś takiego jest chyba być trochę przesadzony i rozwiązanie z substr i strrpos jest najlepsze.
JoShiMa
Cytat(pyro @ 4.11.2008, 19:36:32 ) *
[offtopic]
Joshima, n/c, jak juz mnie nazywasz przedszkolakiem, to chociaz przedszkolakiem chodzącym do zerówki smile.gif
[/offtopic]


[offtopic]
Przecież nie Ciebie tylko ewentualnie autora wątku i innych szukających tu wiedzy tongue.gif
[/offtopic]
michalg
Cytat(JoShiMa @ 4.11.2008, 17:35:25 ) *
Jakoś tak się ciągle słyszy, że preg_i są szybsze.


Szybsze of ereg_, ale czy szybsze od str* ?
pyro
Cytat(michalg @ 4.11.2008, 17:44:34 ) *
Szybsze of ereg_, ale czy szybsze od str* ?


a jak ty tu chcesz uzyc str* ?
bregovic
JoShiMa, co prawda to off-top, ale w moim doświadczeniu, dla prostych operacji na stringach funkcje str* są szybsze. Z odrobiną wyrafinowania, i dużą ilością manual-foo można z nimi zajść bardzo daleko. Poza tym:
Cytat(http://en.wikiquote.org/wiki/Jamie_Zawinski)
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

winksmiley.jpg
michalg
Cytat(pyro @ 4.11.2008, 18:04:04 ) *
a jak ty tu chcesz uzyc str* ?


Chodziło mi ogólnie o funkcje stringowe, czyli w tym przypadku kombinacja strrpos i substring.
pyro
Cytat(bregovic @ 4.11.2008, 18:05:00 ) *
JoShiMa, co prawda to off-top, ale w moim doświadczeniu, dla prostych operacji na stringach funkcje str* są szybsze. Z odrobiną wyrafinowania, i dużą ilością manual-foo można z nimi zajść bardzo daleko. Poza tym:

winksmiley.jpg



DOBRA, WSZYSTKO LADNIE I PIEKNIE I ZEBY POPRZEDZIC NASTEPNE WYPOWIEDZI, PODALEM PRZYKLAD Z PREGIEM, PONIEWAZ AUTOR POWIDZIAL ZE SZUKA INNEGO ROZWIAZANIA POZA STRPOS I SUBSTR, GDYBY TEGO NIE ZROBIL, TO BYM PODAL WLASNIE TAKI PRZYKLAD Z STRPOSEM I SUBSTR, WIEC NIE MOWCIE JUZ ZE KLAPA Z WYRAZENIAMI

AMEN

smile.gif

na koniec jakby ktoś chciał se sprawdzic co jest najszybsze:

  1. <?php
  2.  
  3. $tekst = 'costam=123';
  4.  
  5. list($time_s1) = explode(' ', microtime());
  6. $a = preg_replace('|=[0-9]+|', '', $tekst);
  7. echo $a.'<br />';
  8. list($time_e1) = explode(' ', microtime());
  9. echo '<br />'; echo $time_f1 = ($time_e1 - $time_s1); echo '<br />';
  10.  
  11. list($time_s2) = explode(' ', microtime());
  12. $b = ereg_replace('=[0-9]+', '', $tekst);
  13. echo $b.'<br />';
  14. list($time_e2) = explode(' ', microtime());
  15. echo '<br />'; echo $time_f2 = ($time_e2 - $time_s2); echo '<br />';
  16.  
  17. list($time_s3) = explode(' ', microtime());
  18. $c = substr($tekst,0,strRpos($tekst, "="));
  19. echo $c.'<br />';
  20. list($time_e3) = explode(' ', microtime());
  21. echo '<br />'; echo $time_f3 = ($time_e3 - $time_s3); echo '<br />';
  22.  
  23. $times = array();
  24. $times['preg*'] = $time_f1;
  25. $times['ereg*'] = $time_f2;
  26. $times['"stringowe"'] = $time_f3;
  27.  
  28. asort($times);
  29. echo '<br /> Kolejność od najszybszego do najwolniejszego:<br />';
  30. foreach($times as $key => $value)
  31. {
  32. echo $key.'<br />';
  33. }
  34.  
  35. ?>


lol, okazuje sie ze ereg jest szybsze od preg... &*T^&?
michalg
Cytat(pyro @ 4.11.2008, 18:31:08 ) *
na koniec jakby ktoś chciał se sprawdzic co jest najszybsze:


Dobrze by każdy test było powtórzyć parę(naście, dziesiąt) tysięcy razy.
bregovic
[super-ot]
Nie chcę dolewać oliwy do ognia pyro, ale twój test jest nie do końca reprezentatywny winksmiley.jpg
[/super-ot]
pyro
Cytat(michalg @ 4.11.2008, 18:33:56 ) *
Dobrze by każdy test było powtórzyć parę(naście, dziesiąt) tysięcy razy.


ja go powtorzylem kilkanascie razy i za kazdym razem bylo:

string
ereg
preg

co mnie zdziwilo troche
phpion
Cytat(pyro @ 4.11.2008, 20:31:08 ) *
lol, okazuje sie ze ereg jest szybsze od preg... &*T^&?

Lol, takie testy to tylko o kant pośladków rozbić!
Za http://pl.php.net/manual/pl/function.ereg.php:
Cytat
Informacja: preg_match(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg().
pyro
Cytat(bregovic @ 4.11.2008, 18:34:57 ) *
[super-ot]
Nie chcę dolewać oliwy do ognia pyro, ale twój test jest nie do końca reprezentatywny winksmiley.jpg
[/super-ot]



Rozwiń konkluzję to poprawię, pisałem go na szybko, więc nawet nie wiem czy zrobilem jakies bledy, ale go uruchomilem iles tam razy u siebie i dziala...
bregovic
Ugh, szybka dyskusja. Inni już napisali jak to testować. Najlepiej w pętli, parędziesiąt tysięcy raz, no i najlepiej na własnej maszynie, która nie robi niczego innego (ale to już trochę analna bajka).
BTW, nie używajcie ereg'ów - w PHP6 zostaną wykopane.
pyro
Cytat(phpion @ 4.11.2008, 18:35:08 ) *
Lol, takie testy to tylko o kant pośladków rozbić!
Za http://pl.php.net/manual/pl/function.ereg.php:


(Gulp!), boję się, że ktoś mnie zaraz zbeszta za to co gadam, ale jeśli tak, to proszę tylko nie w twarz.

Błędów nie spostrzeglem w swoim mini teściku, a wykazuje on ze ereg jest szybszy, co wedlug mnie tez nie jest poprawne, dlatego sie zdziwilem dlaczego tak pokazuje tongue.gif
michalg
Nie chodzi o odpalenie testu kilka razy i sprawdzenie, czy za każdym razem rezultat jest ten sam, tylko o wykonanie każdego polecenia w pętli kilkadziesiąt tysięcy razy i zmierzenie czasu wykonywania całej pętli.

Ale to i tak zawsze będzie test syntetyczny, który nie da miarodajnych wyników. Choćby dlatego, że w zastosowaniach rzeczywistych mogą być inne stringi do przetworzenia i być może okaże się, że dla dłuższych lepszy jest preg, a dla krótszych ereg itp.

Inna sprawa, że czasem nie warto kierować się milisekundową różnicą.

[offtopic]

Ale czasem dobrze robić takie testy, bo są przypadki, kiedy pewne funkcje faktycznie działają drastycznie szybciej od innych - na przykład isset zamiast array_key_exists - o ile dobrze pamiętam to zamiana tych funkcji przyśpieszyła mój algorytm z 45 minut do ok 20 sekund (ale tam te funkcje były wykonywane kilkaset tysięcy razy). Dlatego warto stosować isset - o ile w wartościach tablicy nie ma wartości null.

[/offtopic]
pyro
btw. mimo wszystko lepiej uzywać PCRE , ponieważ są bardziej rozbudowane, mają więcej opcji i mają być usunięte w PHP6, finito
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.