Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> strpos, który string ma więcej znalezionych znaków.
Cinamicom
post
Post #1





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Może lepiej użyć pathinfo i porównań?
Albo parse_url.

Ten post edytował trueblue 16.05.2014, 07:40:27
Go to the top of the page
+Quote Post
Cinamicom
post
Post #3





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


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.
Go to the top of the page
+Quote Post
Sephirus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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ć.

Ten post edytował trueblue 16.05.2014, 08:01:16
Go to the top of the page
+Quote Post
Cinamicom
post
Post #6





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


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 ?

Ten post edytował Cinamicom 16.05.2014, 08:46:57
Go to the top of the page
+Quote Post
Sephirus
post
Post #7





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


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ą

Ten post edytował Sephirus 16.05.2014, 09:09:37
Go to the top of the page
+Quote Post
Cinamicom
post
Post #8





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


A jakoś inaczej to zrobić?
Go to the top of the page
+Quote Post
Sephirus
post
Post #9





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
Cinamicom
post
Post #10





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


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.

Ten post edytował Cinamicom 16.05.2014, 09:53:34
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 15:15