Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: schemat stringa
Forum PHP.pl > Forum > PHP
rzseattle
Mam problem ze stworzeniem schematu stringa i pozyskiwaniem dzieki niemu odpowiednich zmienych.

Na samym wstepie spotkalem sie z problemem przy funkcji sscanf. Przy kodzie:

[php:1:a4eed5a715]<?php
$schema = "index.php?/{module}/{action}";
$link = "index.php?/admin/show_actions";

$translate = array(
"{module}" => "%2$s",
"{action}" => "%1$s",
);

$schema = strtr( $schema, $translate);

$n = sscanf($link, $schema);
ksort($n);
print_r($n);
?>[/php:1:a4eed5a715]

zwraca ona:
Kod
Array

(

    [0] =>

    [1] =>

    [4] => admin/show_actions

)


a wiec nie traktuje ona '/' jako przerwy i przyporzadkowywuje nastepna zmienna do pierwszej. W manualu znalazlem cos takiego
Cytat
An optional padding specifier that says what character will be used for padding the results to the right string size. This may be a space character or a 0 (zero character). The default is to pad with spaces. An alternate padding character can be specified by prefixing it with a single quote ('). See the examples below.

Problem w tym ze przykladow nie ma a uzycie ' jako prefiksu przed slashem nie pomaga.

Drugi problem jaki sie pojawi to to ze link moze miec zmienna liczbe parametrow i nie za bardzo sobie wyobrazam (jeszcze?) jak pozniej zapetlic reszte parametrow aby schemat
Kod
$schema = "index.php?/{module}/{action}/{paramName}/{paramValue}";
dzialal rowniez w przypadku
Kod
"index.php?/admin/show_actions/param1/value1/param2/value2"



Ogolnie mowiac nie uperam sie przy tym sposobie. Jesli ktos ma lepszy to bede wdzieczny za udzielenie wskazowek, jesli jedak nie to moze ktos sie przyjzy powyzszemu kodowi.

Z gory dziekuje.
rmn
Podejrzewam, ze o tym wiesz, ale efekt, który chcesz osiągnąc można zorganizować na poziome serwera www.
rmn
albo moze tak:
[php:1:410e191437]<?php
$string="index.php?var1/value1/var2/value2" ;

$string = substr($string,strpos($string,'?')+1);
$temp = explode('/',$string);

$i=0;

while(isset($temp[$i+1]))
{
$array[$temp[$i]] = $temp[$i+1];
$i+=2;
}

print_r($array);
?>[/php:1:410e191437]

Nie wiem czy o to Ci chodzi, ale w każdym taka instrukcja ppowinna zwrócić tablice assocjacyjna z odpowiednimi wartosciami. Problem pojawi się, gdy w adresie nie kazdą wyliczona zmienna będzie miała przypisaną wartosc.

UPDATE mnostwo tu bledow zaraz poprawei:)
UPDATE2 ok teraz dziala:)
rzseattle
Cytat
Podejrzewam, ze o tym wiesz, ale efekt, który chcesz osiągnąc można zorganizować na poziome serwera www.


Jesli chodzi ci o mod_rewrite to nie mozna. Server moze przekierowac cie na strone jesli adres spelnia odpowiedni warunek ale to nie o to mi chodzi. Zalezy mi na wyciagnieciu danych z istniejacejacego linka a to jak ten link mialby wygladac to kwestia mojej wyobrazni a w tym konkretnym przypadku server nie ma nicdo rzeczy.

Update

rmn twoj sposob jest sztywny a mi wlasnie chodzi o elastycznosc (nie pozamieniasz kolejnosci wyrazen, nie zmienisz separatorow i wogole niczego ie mozesz zmienic) pozatym na tej zasadzie dekodowanielinka juz u mnie dziala
rmn
dziwne sscanf ze spacjami w schema dziala a ze salhami albo | nie..
rzseattle
Cytat
A wyrazenia regularne?


Wyrazenia regularne sa dobre do pozyskania jednej wartosci, nie do uzyskania kilku zmiennych, a niechcialbym miec do kazdej zmiennej osobnego wyrazenia.

uff nie myslalem ze problem okaze sie tak zakrecony :/
rmn
adnotacja do ostatniego mojego updatu:
Chodziło mi o to,że
[php:1:d17241520e]<?php
$n = sscanf("index.php? admin show_actions", "index.php? %s %s");
?>[/php:1:d17241520e]
zadzaiała
a
[php:1:d17241520e]<?php
$n = sscanf("index.php?/admin/show_actions", "index.php?/%s/%s");
$n = sscanf("index.php?|admin|show_actions", "index.php?|%s|%s");
?>[/php:1:d17241520e]
nie zadziałaja..

dobra ide sapc:)
rzseattle
Cytat
nie zadziałaja..
wlasnie nie zadziala :/ (zobacz pierwszy post biggrin.gif) , ale juz sobie z tym poradzilem wprowadzajac %[^/] . Jednak pojawil sie eszcze jeden problem. Wykorzystujac %1/$[^/] powoduje ze znalezony element jest dodawany na poczatek tablicy potem umieszczam jeszcze drugi ale nastepne elementy chcialbym juz dodawac jak na stos jeden za drugim - niestety narazie jest to niemozliwe
Cytat
cannot mix "%" and "%n$" conversion specifiers
.
Moze jak nad tym jeszcze posiedze to sie uda jakos to obejsc.

Czy naprawde nikt nie zna prostszego sposobu?

Update:
%1/$[^/] - jest o dupe rozczasc - niby dziala, jak kombinujesz z parametrem to zmienia sie pozycja znalezonego stringa w zwroconej tablicy, ale jak przesuniesz wyrazenie w stringu to tez zmienia pozycje w tablicy grrrr....
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.