string splitsen met regex

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan R

Jan R

24/09/2021 02:08:57
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$match='/\[\]/';
preg_match($match, $kv[0], $m);

Ik verwachte dat in $m de 3 delen zouden staan maar toch niet.
Ook /\[*\]/ lukt niet
 
PHP hulp

PHP hulp

28/03/2024 19:51:19
 
Ward van der Put
Moderator

Ward van der Put

24/09/2021 07:51:45
Quote Anchor link
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 "`".
 
Rob Doemaarwat

Rob Doemaarwat

24/09/2021 07:53:56
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.
Gewijzigd op 24/09/2021 07:57:45 door Rob Doemaarwat
 
Jan R

Jan R

25/09/2021 09:43:05
Quote Anchor link
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
 
Rob Doemaarwat

Rob Doemaarwat

25/09/2021 10:09:57
Quote Anchor link
Heb je het al met parse_str() geprobeerd? Niet helemaal wat je zoekt, maar wel "ingebakken"
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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)
Gewijzigd op 25/09/2021 10:11:58 door Rob Doemaarwat
 
Jan R

Jan R

25/09/2021 10:39:15
Quote Anchor link
Eerste zich was prachtig. Echter als de parameter GEEN array is staat deze er niet bij.
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
 
Rob Doemaarwat

Rob Doemaarwat

25/09/2021 13:09:47
Quote Anchor link
Dan het "blokhaak deel" optioneel maken (deel tussen haakjes plaatsen met een vraagteken er achter):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.
Gewijzigd op 25/09/2021 13:10:27 door Rob Doemaarwat
 
Ad Fundum

Ad Fundum

26/09/2021 14:15:14
Quote Anchor link
Gaat dat niet automatisch via $_GET?
En waarom maak je geen gebruik van parse_url() ?
Gewijzigd op 26/09/2021 14:18:54 door Ad Fundum
 
Jan R

Jan R

26/09/2021 14:35:54
Quote Anchor link
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

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.
 
Rob Doemaarwat

Rob Doemaarwat

26/09/2021 14:57:30
Quote Anchor link
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):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
preg_match_all('/(\\w+)(\\[(.*?)\\])?=(.+?)(&|$)/',$str,$matches,PREG_SET_ORDER);
 
Ad Fundum

Ad Fundum

27/09/2021 09:13:39
Quote Anchor link
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?
Gewijzigd op 27/09/2021 09:17:20 door Ad Fundum
 
Ivo P

Ivo P

27/09/2021 10:25:40
Quote Anchor link
Ik sluit me aan bij Ad: Waarom geen $_GET?

Ik zou beginnen met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<pre><?php print_r($_GET,1);?></pre>


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
 
Jan R

Jan R

27/09/2021 10:51:23
Quote Anchor link
via redirect werkt get niet. vandaar REQUEST_URI
 
Ivo P

Ivo P

27/09/2021 10:57:06
Quote Anchor link
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?
 
Jan R

Jan R

27/09/2021 16:24:00
Quote Anchor link
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
 
Ivo P

Ivo P

27/09/2021 17:12:23
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.