[PHP] String splitsen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een lijn regel dat een string moet splitsen bij een komma in een array, maar niet bij een komma die gequoted is. Ook kan een gedeelte van de string tussen de komma geen qoutes nodig hebben, namelijk bij integers.

eg:

PHP:
1
2
3
4
5
$string = "\"test tekst\",782563,\"tekst, en nog meer tekst\"";

preg_match_all("/\"[^\"]+\"|[^\,]+/", $string, $array, PREG_PATTERN_ORDER);

var_dump($array);


Uitput:
code:
1
2
3
4
5
6
7
8
9
10
11
array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(12) ""test tekst""
    [1]=>
    string(6) "782563"
    [2]=>
    string(26) ""tekst, en nog meer tekst""
  }
}


Ik ben een tijdje opzoek geweesd naar de beste manier. Ik kwam op deze uit. Enige nadeel van deze is dat hij de quotes om de string meepakt.
Misschien weet iemand een betere methode om strings te splitsen bij de komma, maar niet bij een komma die gequote is.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Door zelf een parser te schrijven die de state bijhoudt. Maar dan lijkt het me makkelijker om gewoon de leading en trailing " weg te halen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op 27 May 2003 @ 09:23:
Door zelf een parser te schrijven die de state bijhoudt. Maar dan lijkt het me makkelijker om gewoon de leading en trailing " weg te halen.
Een parser die de state bijhoudt? Leg eens uit.

Ik snap inderdaad ook wel dat ik heel simpel de opening en slutings quotes kan weghalen. Maar ik wil graag andere manieren weten van andere mensen om deze string te splitsen.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Ik kan je hier wel de theorie van een tokenizer met een state uit gaan leggen, maar daar is op internet wel redelijk veel over te vinden. In php is het werken met een regexp wel een leuke oplossing (je krijgt nu alleen een probleem waneer je een " binnen je string wilt gebruiken ;))

Korte uitleg:
Je gaat teken voor teken je string bij langs. Zodra je een quote tegenkomt zit je binnen een string (is een state). Zit je binnen een string en kom je weer een quote tegen dan ga je je string weer uit. Zodra je een komma tegen komt en je zit niet binnen een string heb je je volgende element.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb gekeken in de PHP manual en vond iets over tokens. Maar dat leek mij niet erg te gaan over dit onderwerp. Voorlopig blijft pregs of regs de enige oplossing.

Het probleem met een quote in een gequote gedeelte lijkt mij niet voor te komen. Evenals een komma in een integer veld dat niet is gequoted :) .

[ Voor 31% gewijzigd door Verwijderd op 27-05-2003 10:24 ]


Acties:
  • 0 Henk 'm!

Verwijderd

kijk eens in de PHP "Pattern Syntax" documentatie. daar staat iets in over conditional pattern matching, das erg handig voor je probleem.
PHP:
1
2
3
$string = '"test tekst", 782563, "tekst, en nog meer tekst", "", 5, "5"';
preg_match_all('/(")?((?(1)[^"]*|[\d]+))(?(1)")/', $string, $array);
var_dump($array[2]);

geeft:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array(6) {
  [0]=>
  string(10) "test tekst"
  [1]=>
  string(6) "782563"
  [2]=>
  string(24) "tekst, en nog meer tekst"
  [3]=>
  string(0) ""
  [4]=>
  string(1) "5"
  [5]=>
  string(1) "5"
}

dit matcht strings met dubbele quote en integers, ook lege strings dus en geen overbodige spaties. maar je kunt het verschil tussen de string "5" en integer 5 niet zien.

algemene tip is om je reg patterns in enkele quotes te zetten ('), dat leest veel makkelijker dan met "

Acties:
  • 0 Henk 'm!

Verwijderd

Janoz schreef op 27 mei 2003 @ 10:06:
Ik kan je hier wel de theorie van een tokenizer met een state uit gaan leggen, maar daar is op internet wel redelijk veel over te vinden. In php is het werken met een regexp wel een leuke oplossing (je krijgt nu alleen een probleem waneer je een " binnen je string wilt gebruiken ;))
dat is (gedeeltelijk of helemaal) op te lossen met preg assertions, zie Pattern Syntax in php docs, heel erg goede doc. :Y)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

kleine aanpassing waarmee escaped quotes in een string ook goed gaan:
PHP:
1
2
3
4
5
6
7
8
9
<?php

$string = '"test tekst",782563,"tekst, en nog meer tekst met \"escaped\" quotes"';

preg_match_all('/(")?((?(1)(\\\"|[^"])*|[\d]+))(?(1)")/', $string, $array); 

print_r($array[2]);

?>

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op 27 May 2003 @ 10:37:
kleine aanpassing waarmee escaped quotes in een string ook goed gaan:
PHP:
1
2
3
4
5
6
7
8
9
<?php

$string = '"test tekst",782563,"tekst, en nog meer tekst met \"escaped\" quotes"';

preg_match_all('/(")?((?(1)(\\\"|[^"])*|[\d]+))(?(1)")/', $string, $array); 

print_r($array[2]);

?>
Deze werkt erg mooi. Alleen ik vergis me met de integers. Deze kunnen ook floating points zijn. En dat wordt niet gepakt door deze syntax.

//edit
Ik heb [\d] veranderd in [0-9.]. Ik heb nog niet eerder met deze soort van regular expressions gewerkt. Dus ik moest even opzoeken hoe de syntax inelkaar zit.

[ Voor 45% gewijzigd door Verwijderd op 27-05-2003 11:09 ]

Pagina: 1