[PHP]Variabele in url veranderen mbv reg exp's

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Ik heb een url die er bijvoorbeeld als volgt uitziet:

index.php?section=view&article=14&slide=2&list=1

Dit is een url naar mijn website, waarbij ik nu een fotoalbum met reacties aan het bekijken ben. slide=2 geeft aan dat ik de 2e pagina met foto's aan het bekijken ben, list=1 geeft de 1e pagina met reacties aan. Nu wil ik knoppen toevoegen zodat ik door de foto's en de reacties kan bladeren (ophogen of verlagen van slide en list dus). Dit wil ik doen zonder de rest van de url te veranderen (of de url opnieuw aan te maken).

Ik heb dit deels al werkend, ik blader bijvoorbeeld op de volgende manier door de reacties:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if ($number_lists > 1) {
    if ($list > 1) {
        if (eregi('list',$url))
            $previous = preg_replace_callback('/slide=(\d+)|list=(\d+)/U','decrement',$url);
        else
            $previous = $url.'&list='.$list--;
        echo "\n<div class=\"left\" onclick=\"document.location='$previous'\">";
        echo "\n</div>";
        }
    if ($list < $number_lists) {
        if (eregi('list',$url)) {
            $next = preg_replace_callback('/slide=(\d+)|list=(\d+)/U','increment',$url);
            }
        else
            $next = $url.'&list='.$list++;
        echo "\n<div class=\"right\" onclick=\"document.location='$next'\">";
        echo "\n</div>";
        }
    }

Hierbij gebruik ik de volgende PHP-functies:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function increment($matches) {
    $replace = array ('slide', 'list');
    for ($i = 1; $i < sizeof($matches); $i++) {
        if(!empty($matches[$i])) {
            if ($replace[$i - 1] == 'list') {
                $matches[$i]++;
                return 'list='.$matches[$i];
                }
            elseif ($replace[$i - 1] == 'slide') {
                $matches[$i]++;
                return 'slide='.$matches[$i]++;
                }
            }
        }
    }

function decrement($matches) {
    $replace = array ('slide', 'list');
    for ($i = 1; $i < sizeof($matches); $i++) {
        if(!empty($matches[$i])) {
            if ($replace[$i - 1] == 'list') {
                $matches[$i]--;
                return 'list='.$matches[$i];
                }
            elseif ($replace[$i - 1] == 'slide') {
                $matches[$i]--;
                return 'slide='.$matches[$i]++;
                }
            }
        }
    }

Dit werkt in principe prima. Het komt alleen nogal omslachtig over. Makkelijker zou zijn om mbv de preg_replace_callback functie de variabele list en zijn waarde apart in een array te krijgen, zodat ik alleen die waarde++ (of --) hoef te doen, maar hoe moet in dat geval mijn reguliere expressie eruit zien? Kan het uberhaupt? Op die manier hoef ik namelijk niet met dat replace-array te werken, en is het wat universeler bruikbaar.

(het lijkt misschien een omslachtige manier, maar als het goed werkt is het wel de mooiste manier denk ik)

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:52
Waarom wil je niet alle argumenten die in de URL staan benoemen in je applicatie en van daaruit vullen met de gegevens van de huidige URL. Je kunt dan één parameter wijzigen en een functie aanroepen die de URL opnieuw opbouwd.

:?.

Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Dat kan idd ook, maar dan krijg ik net zo goed een hele lange functie, ik heb namelijk nog een zooi andere GET-variabele die ik dan allemaal 1 voor 1 moet controleren en evt toevoegen.

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:52
Naar mijn mening is het wel een nettere methode ;).

Verder kun je natuurlijk met creatief zoeken bij welke positie een bepaalde parameter begint en eindigt gewoon simpel replacen, zonder dat je daarvoor regex functies nodig hebt.

Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Zoiets had ik in 1e instantie ook. Ik bedacht me toen dat het eigenlijk toch beter moest kunnen. Ik lees nu gewoon de url als volgt uit:
code:
1
2
3
$url = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING']))
    $url = $url.'?'.$_SERVER['QUERY_STRING'];

En verander de gewenste waarde met de functie zoals hierboven. Dat vind ik toch een betere methode, maarja nu moet ik die functie dus nog een beetje verfijnen, voor zover dat gaat.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:26

crisp

Devver

Pixelated

wat dacht je van $_GET['slide']++ en dan met een foreach door $_GET heengaan om je querystring weer op te bouwen?

Intentionally left blank

Pagina: 1