Het ik ben bezig met een kleine import module voor een script waar ik mee bezig ben en nu heb ik het volgende probleem.

Een string ziet er als volgt uit:

<?php

$string = 'tekst, tekst, tekst, "tekst, tekst", tekst, tekst';

?>

Nu wil ik dat alles tussen de komma in een array wordt gezet, dat doe je met de functie explode, maar het stukje tussen aanhalingstekens moet dus worden over gestagen waardoor ik de volgende output krijg:

<?php

$array[]='tekst';
$array[]='tekst';
$array[]='tekst';
$array[]='"tekst, tekst"';
$array[]='tekst';
$array[]='tekst';

?>

in plaats van:

<?php

$array[]='tekst';
$array[]='tekst';
$array[]='tekst';
$array[]='"tekst';
$array[]='tekst"';
$array[]='tekst';
$array[]='tekst';

?>

Ik hoop dat het zo duidelijk is...

Mvg,

Marc
probeer eens:
$string = 'tekst, tekst, tekst, \"tekst, tekst\", tekst, tekst';

mn browser deed ff wazig dus ik kon de pagina niet bekijken, maar mss is het wat: http://nl2.php.net/addslashes
@flip
hij wilt ze wel behouden.

je kan dat deel ook weer exploden, maar dan krijg je wel een lange oplossing. Met een regex gaat t veel makkelijker.
Ik kom een aardig eind, kijk maar:

<?php
$string = '"tekst, tekst, tekst", tekst, tekst, tekst, "tekst, tekst", tekst, tekst, "tekst, tekst"';
preg_match_all('/([^,"\ ]+)*("[^"]+")*/', $string, $array);

print '<pre>' . print_r($array, true) . '</pre>';
?>

output =

Array
(
    [0] => Array
        (
            [0] => 
            [1] => "tekst, tekst, tekst"
            [2] => 
            [3] => 
            [4] => tekst
            [5] => 
            [6] => 
            [7] => tekst
            [8] => 
            [9] => 
            [10] => tekst
            [11] => 
            [12] => 
            [13] => 
            [14] => "tekst, tekst"
            [15] => 
            [16] => 
            [17] => tekst
            [18] => 
            [19] => 
            [20] => tekst
            [21] => 
            [22] => 
            [23] => 
            [24] => "tekst, tekst"
            [25] => 
        )



Er komen dus alleen veel lege dingen tussen maar die kun je zo filteren, of je moet de reg-ex effe verbeteren.
Daar kan ik wel wat mee denk ik !
Tnx !!
En om precies te krijgen wat jij wil kun je dit doen:

<?php
$string = '"tekst, tekst, tekst", tekst, tekst, tekst, "tekst, tekst", tekst, tekst, "tekst, tekst"';
preg_match_all('/([^,"\ ]+)*("[^"]+")*/', $string, $array);

foreach ($array[0] as $key => &$value) {
$value = trim($value);

if (empty($value)) {
unset($array[0][$key]);
}
}

print '<pre>' . print_r($array[0], true) . '</pre>';
?>

Output=
Array
(
    [0] => "tekst, tekst, tekst"
    [3] => tekst
    [6] => tekst
    [9] => tekst
    [12] => "tekst, tekst"
    [15] => tekst
    [18] => tekst
    [21] => "tekst, tekst"
)

Je kunt ook nog effe de keys resetten natuurlijk.
Dat is een knap stukje reguliere expressies !!

Het enige wat ik me afvraag is waar die "&" voor dient die je voor "$value" in de foreach loop hebt gezet.
Dat is de reference operator. Daarmee zorgt PHPerik er voor dat de oorspronkelijke arrayelementen ook daadwerkelijk gewijzigd worden. Als je dat niet op die manier doet, werk je in een kopie van het origineel.
aha oke, nogmaals bedankt voor jullie hulp, nu kan ik eindelijk verder !

Reageren