string splitsen met regex
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
[ 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 "`".
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
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
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
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
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
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.
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 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
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?
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
Inderdaad. topic 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.