string splitsen met regex
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
Ik verwachte dat in $m de 3 delen zouden staan maar toch niet.
Ook /\[*\]/ lukt niet
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
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 "`".
[ 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:
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.
Alvast 2 schoten voor de boeg:
Code (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
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
<?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
)
*/
?>
$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.
Gewijzigd op 24/09/2021 07:57:45 door Rob Doemaarwat
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
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"
En anders met een reg-ex:
(die eerste entry is de steeds "full match", dus die moet je even wegdenken)
Code (php)
En anders met een reg-ex:
Code (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
32
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
32
<?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
)
) */
?>
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)
Gewijzigd op 25/09/2021 10:11:58 door Rob Doemaarwat
Eerste zich was prachtig. Echter als de parameter GEEN array is staat deze er niet bij.
vb: /schaak/sc_post-gent/?page[]=kruistabel0&page[2]=kruistabel1&page[]=kruistabel2&id=5&trn=40
Quote:
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):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.
Code (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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?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
)
)
*/
?>
$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
)
)
*/
?>
Gewijzigd op 25/09/2021 13:10:27 door Rob Doemaarwat
Gaat dat niet automatisch via $_GET?
En waarom maak je geen gebruik van parse_url() ?
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?
omdat ik dat niet ken(de) :)
Jan
Toevoeging op 26/09/2021 14:42:39:
ps1: Ik splits nu om verder te kunnen op 'a' ipv '-'
ps2: ook geprobeerd met ~, + en een paar andere tekens. De gegevens verdwijnen eveneens.
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() ?
En waarom maak je geen gebruik van parse_url() ?
omdat ik dat niet ken(de) :)
Jan
Toevoeging op 26/09/2021 14:42:39:
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):
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?
Ik sluit me aan bij Ad: Waarom geen $_GET?
Ik zou beginnen met
volgens mij zit daar alles al in, inclusief de array's.
Zou de het niet om de huidige url gaan, maar in de openingspost is sprake van $_SERVER['REQUEST_URI'], dan is een stap via parse_url() nodig.
Zie in dat geval ook de voorbeelden en bijdragen van gebruikers in de manual op php.net
Ik zou beginnen met
volgens mij zit daar alles al in, inclusief de array's.
Zou de het niet om de huidige url gaan, maar in de openingspost is sprake van $_SERVER['REQUEST_URI'], dan is een stap via parse_url() nodig.
Zie in dat geval ook de voorbeelden en bijdragen van gebruikers in de manual op php.net
via redirect werkt get niet. vandaar REQUEST_URI
Na een redirect ben je ook je REQUEST_URI kwijt.
Of gebruik je een constructie waarbij een redirect de oorspronkelijke url weer in ?url=.... plaatst?
(maar dan heb je ook REQUEST_URI niet nodig)
Toevoeging op 27/09/2021 11:00:33:
wacht: ik zie schaak.
Was dat niet eerder een topic waarbij aangeraden werd om alle requests te laten afhandelen via /index.php of via /schaak.php ?
Maar dat gaat dan met een rewriterule met [L] (en dat is in tegenstelling tot [R] geen redirect).
Maar dan zou $_GET gewoon beschikbaar moeten zijn. (en zelfs de rest van het oorspronkelijke path, mits je inderdaad REQUEST_URI of REDIRECT_URL opvraagt).
Heb je getest of $_GET inderdaad kwijt is?
Of gebruik je een constructie waarbij een redirect de oorspronkelijke url weer in ?url=.... plaatst?
(maar dan heb je ook REQUEST_URI niet nodig)
Toevoeging op 27/09/2021 11:00:33:
wacht: ik zie schaak.
Was dat niet eerder een topic waarbij aangeraden werd om alle requests te laten afhandelen via /index.php of via /schaak.php ?
Maar dat gaat dan met een rewriterule met [L] (en dat is in tegenstelling tot [R] geen redirect).
Maar dan zou $_GET gewoon beschikbaar moeten zijn. (en zelfs de rest van het oorspronkelijke path, mits je inderdaad REQUEST_URI of REDIRECT_URL opvraagt).
Heb je getest of $_GET inderdaad kwijt is?
Inderdaad. topic https://www.phphulp.nl/php/forum/topic/htaccess-redirect/104083/last/
Get is verdwenen maar ik heb deze via de htacces terug ingebracht. Spijtig genoeg staat alles in 1 get en deze moet dus opslitsen.
Het topic heeft veel geholpen en blijkt nu te werken (onder wamp). Maar om dan in php alles te splitsen over clubs, type toernooien, andere activiteiten, adressen en nog meer ben ik nu nog aan het prutsen :)
Ik denk dat ik er nu ongeveer uit ben. De laatste loodjes wegen altijd het zwaarst. Dus zal het nu een tijdje duren voordat ik hierop terug kom. Testen testen en nog eens testen. Vandaag nog ondervonden dat ik een tabel niet juist overgebracht heb.
Alweer aan allen welke geholpen hebben om het tot een goed einde te brengen: DANK. Dit kan niet genoeg gezegd worden. Ook ik zie dat vele topics een vraag komt met en antwoord en dan ts niet de moeite doet om beleefd te blijven of zelfs maar dank u te schrijven. Niet alleen hier maar ook op andere fora.
Jan
Get is verdwenen maar ik heb deze via de htacces terug ingebracht. Spijtig genoeg staat alles in 1 get en deze moet dus opslitsen.
Het topic heeft veel geholpen en blijkt nu te werken (onder wamp). Maar om dan in php alles te splitsen over clubs, type toernooien, andere activiteiten, adressen en nog meer ben ik nu nog aan het prutsen :)
Ik denk dat ik er nu ongeveer uit ben. De laatste loodjes wegen altijd het zwaarst. Dus zal het nu een tijdje duren voordat ik hierop terug kom. Testen testen en nog eens testen. Vandaag nog ondervonden dat ik een tabel niet juist overgebracht heb.
Alweer aan allen welke geholpen hebben om het tot een goed einde te brengen: DANK. Dit kan niet genoeg gezegd worden. Ook ik zie dat vele topics een vraag komt met en antwoord en dan ts niet de moeite doet om beleefd te blijven of zelfs maar dank u te schrijven. Niet alleen hier maar ook op andere fora.
Jan
Jan R op 27/09/2021 16:24:00:
Spijtig genoeg staat alles in 1 get en deze moet dus opslitsen.
Ik denk dat je dan de minst handig oplossing hebt gekozen.
Ik zie wel vaker die oplossing langs komen waarbij een redirect gedaan wordt met
RewriteRule (.*) target.php?oudeurl=$1 [R]
Terwijl het leven zo veel gemakkelijker is als je
RewriteRule .* target.php [L]
doet.
Ik zie dan trouwens nog steeds niet hoe $_SERVER['REQUEST_URI'] erbij betrokken is.




