Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: strpos, który string ma więcej znalezionych znaków.
Forum PHP.pl > Forum > PHP
Cinamicom
Witam.

Mam sobie tablicę z adresami, np.:

"contact"=> "bla",
"contact/edit" => "ble"

Potem pobieram sobie adres strony - PHP Self - i mam np. /contact/edit

Sprawdzam sobie (strpos), czy PHP Self = jakiś rekord z tablicy.


No i działa, ale np. wyświetli mi treść dla "contact", i dla "contact/edit" - bo adres zawiera /contact/edit

Da się zrobić, żeby wyświetliło tylko to, co ma więcej znaków znalezionych? W tym przypadku: /contact/edit
trueblue
Może lepiej użyć pathinfo i porównań?
Albo parse_url.
Cinamicom
Może inaczej wytłumaczę.

Mam zrobione przyjazne linki, a teraz robię router.

Mogę to zrobić np. tak: if php self == jakis url z tablicy rozbitej foreach.

Ale jeśli np. dodam na końcu id produktu: /contact/edit/451 - to wtedy będzie mi szukało takiego adresu url. A 451 to tylko parametr.

Dlatego użyłem strpos. Problem w tym, że mając kilka adresów o podobnej nazwie, np" /contact, /contact/edit, /contact/add to zadziała mi funkcja dla tych wszystkich adresów.

Dlatego chcę jakoś z tych znalezionych 3, wybrać ten który ma najwięcej wspólnego z adresem PHP_SELF.
Sephirus
Proste: kolejność adresów w tablicy z której sprawdzasz:


to_jest_tekst_najdłuższy
to_jest_tekst
to_

iterując po tym na zasadzie "znalazłem - kończę" masz rozwiązanie problemu smile.gif
trueblue
To przed pętlą zapisz sobie w zmiennej np. $pos=0.
W pętli zapisuj do $pos wynik ze strpos tylko jeśli jest większy niż aktualny $pos, zapisuj również w tym momencie, w innej zmiennej element tablicy.

EDIT: obydwa stringi trzeba odwrócić.
Cinamicom
Dzięki.

Jeszcze muszę to tylko dopracować.

Właśnie zdałem sobie sprawę, że te rozwiązanie nie jest dobre.

Bo co jeśli mam dwa adresy url o takiej samej ilości znaków? np. /contact/app i /contact/seo ?
Sephirus
Brnąc w to dalej możesz użyć prostych wyrażeń regularnych (analogicznie jak mod_rewrite w apache).

Prosty strukturalny przykład (idea):

  1. $adresy = array(
  2. '/contact/app/' => 'bla1',
  3. '/contact/seo/' => 'bla2',
  4. '/contact/show/([0-9]+)' => 'bla3',
  5. // ....
  6. );
  7.  
  8. $adresWejsciowy; // pobierasz z $_SERVER ...
  9. $stronaWybrana = null;
  10.  
  11. foreach($adresy AS $adres => $strona) {
  12. if(preg_match('#'.$adres.'#',$adresWejsciowy)) {
  13. $stronaWybrana = $strona;
  14. break;
  15. }
  16. }
  17.  
  18. if($stronaWybrana === null) {
  19. die('nie ma takiej strony');
  20. } else {
  21. // obsluga strony...
  22. }


EDIT: zamieszałem coś ze zmienną
Cinamicom
A jakoś inaczej to zrobić?
Sephirus
Ogólnie, żeby to było dokładne to ja widze 3 opcje:

1. konfiguracja linków w .hatccess z odpowiednimi przekierowaniami
2. zastosowanie wyrażeń regularnych (jak w przykładzie wyżej)
3. zastosowanie funckji sscanf

Metoda z strpos nie jest idealna. Bo początek stringu to za mało.
Cinamicom
Konfiguracja .htaccess odpada. Ma być tam uniwersalna konfiguracja, żebym potem nie musiał grzebać po nim.

Gdyby nie ten opcjonalny dodatkowy parametr, nie było by problemu.

Ok, mam pewien pomysł.

Link w tablicy by wyglądał np. tak.
"contacts/edit/*" => "blable"

I teraz potrzebuję odpowiedniego wyrażenia regularnego, który wytnie mi ciąg do znaku "/*". Czyli np. robię to za pomocą explode.

Użycie np. tak: http://localhost/Contact/edit/*512

Pięknie działa.
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.