Cinamicom
16.05.2014, 07:31:46
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
16.05.2014, 07:36:03
Może lepiej użyć
pathinfo i porównań?
Albo
parse_url.
Cinamicom
16.05.2014, 07:42:47
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
16.05.2014, 07:51:54
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
trueblue
16.05.2014, 07:54:17
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
16.05.2014, 08:12:44
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
16.05.2014, 09:08:15
Brnąc w to dalej możesz użyć prostych wyrażeń regularnych (analogicznie jak mod_rewrite w apache).
Prosty strukturalny przykład (idea):
'/contact/app/' => 'bla1',
'/contact/seo/' => 'bla2',
'/contact/show/([0-9]+)' => 'bla3',
// ....
);
$adresWejsciowy; // pobierasz z $_SERVER ...
$stronaWybrana = null;
foreach($adresy AS $adres => $strona) {
$stronaWybrana = $strona;
break;
}
}
if($stronaWybrana === null) {
die('nie ma takiej strony'); } else {
// obsluga strony...
}
EDIT: zamieszałem coś ze zmienną
Cinamicom
16.05.2014, 09:14:31
A jakoś inaczej to zrobić?
Sephirus
16.05.2014, 09:33:09
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
16.05.2014, 09:37:46
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/*512Pię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.