preg_match > vervang komma('s) tussen " "

Pagina: 1
Acties:

  • Crazy-
  • Registratie: Januari 2002
  • Laatst online: 00:19

Crazy-

Best life ever

Topicstarter
Moggûh,

Ben nu al een tijdje bezig om het volgende voor elkaar te krijgen:
PHP:
1
2
3
<?php 
$string = 'bladiebla, bladiebla, bladiabla, "bladiebla, bladiabla", bladieblad, bladieblia, "blabla, bla, bla"';
?>

die string exploden we op komma, _MAAR_ er zitten ook komma's tussen de " ", en daar mag hij niet op explode. Goed die vervang ik dus voor bijv. punten, maar dan gaat het mis.

Ik gebruik de volgende code:

PHP:
1
2
3
4
5
6
7
8
<?php
$string = preg_replace('/"(.*?),(.*?)"/', "\\1.\\2", $string);  

// Resultaat:

$string = 'bladiebla, bladiebla, bladiabla, "bladiebla. bladiabla", bladieblad, bladieblia, "blabla. bla, bla"';
// Ofwel, eerste set " " komma > punt, tweede set " " eerste komma > punt, tweede komma
?>


maar nu vervangt hij de eerste komma, maar niet de 2de/3de etc. (opzich logisch met het feti \\1, \\2)

Probleem is alleen dat ik het verder totaal niet voor elkaar krijg.

ik heb o.a. geprobeerd met:

PHP:
1
2
3
4
5
6
7
8
<?php
$string = preg_replace('/"[,]"/U', ".", $string);   

// Resultaat:

$string = 'bladiebla, bladiebla, bladiabla, "bladiebla, bladiabla", bladieblad, bladieblia, "blabla, bla, bla"';
// Ongewijzigd ....
?>


en met:

PHP:
1
2
3
4
5
6
7
8
<?php
$string = preg_replace('/"[.*,.*]"/U', ".", $string);   
// Resultaat:

$string = 'bladiebla, bladiebla, bladiabla, "bladiebla, bladiabla", bladieblad, bladieblia, "blabla, bla, bla"';
// Ongewijzigd ....

?>


maar forget it ...

wie kan me vertellen wat ik fout doe? Speurtochten op google leverde ook niet echt iets op.

[ Voor 21% gewijzigd door Crazy- op 12-06-2007 10:50 . Reden: Resultaten erbij gezet ]

12,85kWp - ZB 7,5m2/400l - 5kW Pana H WP (CV&SWW) - 13,8kWh accu


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 01-12 13:11
Je laatste voorbeeld.. deed die het helemaal niet of verving hij alleen de eerste komma?
Wel handig als je ook de resultaten erbij zet.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
waarom doe je dit met een regular expression? en niet gewoon met str_replace?

  • Crazy-
  • Registratie: Januari 2002
  • Laatst online: 00:19

Crazy-

Best life ever

Topicstarter
Omdat hij dan in de hele string de komma's vervangt en hij alleen de komma's dient te vervangen tdie tussen de " " staan.

12,85kWp - ZB 7,5m2/400l - 5kW Pana H WP (CV&SWW) - 13,8kWh accu


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Crazy- schreef op dinsdag 12 juni 2007 @ 11:22:
Omdat hij dan in de hele string de komma's vervangt en hij alleen de komma's dient te vervangen tdie tussen de " " staan.
oh, excuus, niet goed gelezen...

werkt zoiets niet?

PHP:
1
$string = preg_replace('/"(.*)"/Ug', "str_replace(\\1, ',', '.')", $string);


ik heb het zelf ooit zo toegepast, weet niet meer waarom precies, maar misschien omdat het alleen met een array werkt:
PHP:
1
preg_replace(array("/\"(.*)\"/Ug"), array("str_replace(\\1, ',', '.')") , $string) ;

[ Voor 40% gewijzigd door P.O. Box op 12-06-2007 11:32 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

Waarom vervang je de komma's door punten? Lijkt me niet handig om data om te gaan vormen. Daarnaast vind ik het nogal een vreemde benadering. In plaats van het aanpakken van het explode probleem ga je een stap ervoor zitten en daar nieuwe problemen introduceren. Het lijkt me veel handiger om juist de explode fase aan te pakken. Je zou ipv de explode functie zelf een stackbased parser kunnen schrijven.

Maar goed, nadat ik je aanpak afgebrand heb zal ik je oo knog even een duw in de juiste richting geven ;) : http://nl3.php.net/fgetcsv

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


  • user109731
  • Registratie: Maart 2004
  • Niet online
Of zo:
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
$inQuotes = false;
$parts = array();
$thisPart = '';

for($i = 0, $len = strlen($string); $i < $len; $i++) 
{
    switch ($string[$i])
    {
        case ',' : 
            if ($inQuotes) { 
                $thisPart .= $string[i];
            } else {
                $parts[] = $thisPart; 
                $thisPart = ''; 
            } 
            break;
        case '"' : 
            $inQuotes = !$inQuotes; 
        default: 
            $thisPart .= $string[$i]; 
    }
}
if ($thisPart != '')
    $parts[] = $thisPart;

:)

  • Crazy-
  • Registratie: Januari 2002
  • Laatst online: 00:19

Crazy-

Best life ever

Topicstarter
aangezien die data inprincipe omgevormd dient te worden van komma naar punt :) maar dat terzijde...

fgetcsv() is de eerste keer dat ik het tegen kom, zal daar eens naar kijken

12,85kWp - ZB 7,5m2/400l - 5kW Pana H WP (CV&SWW) - 13,8kWh accu


  • Crazy-
  • Registratie: Januari 2002
  • Laatst online: 00:19

Crazy-

Best life ever

Topicstarter
fgetcsv() did it ... wat een geweldige functie! :+

[ Voor 9% gewijzigd door Crazy- op 12-06-2007 11:48 ]

12,85kWp - ZB 7,5m2/400l - 5kW Pana H WP (CV&SWW) - 13,8kWh accu

Pagina: 1