Hoi

Ik probeer een tekst ($_SERVER['REQUEST_URI']) te verdelen in substrings.
De tekst wordt gesplitst op []. Een array dus. Echter tussen de haken kan een andere waarde staan. Hoe haal ik deze er uit.
Mijn poging
$match='/\[\]/';
preg_match($match, $kv[0], $m);

Ik verwachte dat in $m de 3 delen zouden staan maar toch niet.
Ook /\[*\]/ lukt niet
Het kan ook snel en doeltreffend met explode().

[ en ] zijn overigens unsafe characters in URL's. Uit RFC 1738:

Other characters are unsafe because gateways and other transport agents are known to sometimes modify such characters. These characters are "{", "}", "|", "\", "^", "~", "[", "]", and "`".
Welke "3 delen" verwacht je precies bij het genoemde voorbeeld (en is dat letterlijk "$_SERVER['REQUEST_URI']", of dat wat er _in_ die variabele zit)?

Alvast 2 schoten voor de boeg:
<?php

$str = '$_SERVER[\'REQUEST_URI\']';

//splitsen op "[" en "]"
print_r(preg_split('/[\\[\\]]/',$str)); /*
Array
(
    [0] => $_SERVER
    [1] => 'REQUEST_URI'
    [2] =>   //lege string
)
*/

//matchen op "het deel voor de 1e blokhaak" en "het deel tussen de blokhaken (en accolades)"
preg_match('/^(.*)\\[\'(.*)\'\\]$/',$str,$match);
print_r($match); /*
Array
(
    [0] => $_SERVER['REQUEST_URI'] //full match
    [1] => $_SERVER //deel voor de blokhaak
    [2] => REQUEST_URI //deel tussen de blokhaken
)
*/

?>

Ah, met Ward z'n opmerking snap ik (mogelijk) waar je heen wilt: /foo[bar]/x[y]/ opsplitsen in foo, bar, x,y (???) Kortom: doe even een voorbeeld met 1) wat heb je als input, en 2) wat wil je als resultaat.
Ik start met
urldecode($_SERVER['REQUEST_URI'])
hier krijg ik bijvoorbeeld: /schaak/sc_post-gent/?page[]=kruistabel0&page[2]=kruistabel1&page[]=kruistabel2

dan splits ik de uri op / om de verschillende onderdelen te hebben
deel 1= map (vast deel), deel 2=club (opgezocht in database) deel 3 extra map of paramters.
indien map deel 4 zijn paramters

Onderzoek de parameters:
splitsen op ? en &
Elke splitsing moet uit 2 delen bestaan. zijnde voor en achter = anders negeren
Het voorste deel kan onderdeel zijn van een array maar is niet altijd zo. page zijn de verschillende pagina's welke getoond moeten worden. trn zijn de verschillende toernooien (niet in voorbeeld).
indien array moet ik ook dat weten welk element hoewel het zelden voorkomt.

Jan

uitkomst van voorbeeld na ? zou moeten zijn:
page, leeg, kruistabel
page, 2, kruistabel1
page, leeg, kruistabel2
Heb je het al met parse_str() geprobeerd? Niet helemaal wat je zoekt, maar wel "ingebakken"
<?php

parse_str(substr(strstr($str,'?'),1),$data);
print_r($data); /*
Array
(
    [page] => Array
        (
            [0] => kruistabel0
            [2] => kruistabel1
            [3] => kruistabel2
        )

)*/
?>


En anders met een reg-ex:
<?php

preg_match_all('/(\\w+)\\[(.*?)\\]=(.+?)\\b/',$str,$matches,PREG_SET_ORDER);
print_r($matches); /*
Array
(
    [0] => Array
        (
            [0] => page[]=kruistabel0
            [1] => page
            [2] => 
            [3] => kruistabel0
        )

    [1] => Array
        (
            [0] => page[2]=kruistabel1
            [1] => page
            [2] => 2
            [3] => kruistabel1
        )

    [2] => Array
        (
            [0] => page[]=kruistabel2
            [1] => page
            [2] => 
            [3] => kruistabel2
        )

) */
?>

(die eerste entry is de steeds "full match", dus die moet je even wegdenken)
Eerste zich was prachtig. Echter als de parameter GEEN array is staat deze er niet bij.

Het voorste deel kan onderdeel zijn van een array maar is niet altijd zo


vb: /schaak/sc_post-gent/?page[]=kruistabel0&page[2]=kruistabel1&page[]=kruistabel2&id=5&trn=40
Dan het "blokhaak deel" optioneel maken (deel tussen haakjes plaatsen met een vraagteken er achter):
<?php

$str = '/schaak/sc_post-gent/?page[]=kruistabel0&page[2]=kruistabel1&page[]=kruistabel2&id=5&trn=40';

preg_match_all('/(\\w+)(\\[(.*?)\\])?=(.+?)\\b/',$str,$matches,PREG_SET_ORDER);
print_r($matches); /*
Array
(
    [0] => Array
        (
            [0] => page[]=kruistabel0
            [1] => page
            [2] => []
            [3] => 
            [4] => kruistabel0
        )

    [1] => Array
        (
            [0] => page[2]=kruistabel1
            [1] => page
            [2] => [2]
            [3] => 2
            [4] => kruistabel1
        )

    [2] => Array
        (
            [0] => page[]=kruistabel2
            [1] => page
            [2] => []
            [3] => 
            [4] => kruistabel2
        )

    [3] => Array
        (
            [0] => id=5
            [1] => id
            [2] => 
            [3] => 
            [4] => 5
        )

    [4] => Array
        (
            [0] => trn=40
            [1] => trn
            [2] => 
            [3] => 
            [4] => 40
        )

)
*/

?>
Index 1 is nu je variabele naam. Als index 2 is gevuld weet je dat het om een array notatie gaat, waarbij dan de evt. array key in index 3 staat. In index 4 staat in alle gevallen je waarde.
Gaat dat niet automatisch via $_GET?
En waarom maak je geen gebruik van parse_url() ?
Ik ben al heel ver dankzij Robs hulp. Dank!
Ik wordt echter nu gewaar dat deze splitsing bepaande delen verwijderd.
uri info: nextround.php?r[]=30&g[]=_591-604_594-597_589-610
verwijderd alles na het koppelteken. Waarom? hoe los ik dat nu op?

Ad Fundum op 26/09/2021 14:15:14

Gaat dat niet automatisch via $_GET?
En waarom maak je geen gebruik van parse_url() ?


omdat ik dat niet ken(de) :)


Jan

[size=xsmall]Toevoeging op 26/09/2021 14:42:39:[/size]

ps1: Ik splits nu om verder te kunnen op 'a' ipv '-'
ps2: ook geprobeerd met ~, + en een paar andere tekens. De gegevens verdwijnen eveneens.
De regex ging nu tot de eerste "word break" ("\\b"). Een "-" is ook een "word break". Volgens mij werkt het zo beter (tot de volgende ampersand, of einde regel):

preg_match_all('/(\\w+)(\\[(.*?)\\])?=(.+?)(&|$)/',$str,$matches,PREG_SET_ORDER);
Jan R op 26/09/2021 14:35:54

omdat ik dat niet ken(de) :)

Dat herken ik. Naast dat het een programmeertaal is heeft PHP nog steeds trekken van een enorme code snippet database, en functionaliteit is op verschillende manieren dubbel uitgevoerd.
Neem bijvoorbeeld utf8encode().. dat werkt alleen met Latin1.. lekker handig! (NOT!)
Als je je eenmaal door een berg functies hebt geworsteld kom ik er soms jaren later achter dat het toch nog weer anders kan.
Waarom? Why? Pourquois? Warum? Por qué? Hvorfor?

Reageren