0

I have a list and I want to retrieve all decimal numbers in it. They are stored like this +900.00 or -240.30.
They all have an operator "+" or "-".

$liste = "Pack Eclairage : Lave-phares Projecteurs Bi-X\u00e9non 35W directionnels Feux AV eclairage diurne LED : -400.00Etriers de freins Rouge : +200.00|Jantes en alliage 19\" Performance Noires (avec Pneus Run-On Flat) : +900.00|Pack Confort : Syst\u00e8me d'entr\u00e9e sans cl\u00e9s (conducteur et passager) Eclairage des poign\u00e9es de portes Compartiment porte-objets c\u00f4t\u00e9 conducteur Pare-soleil conducteur avec illumination : +580.00|Peinture Pastel Extra-s\u00e9rie Blanc Alfa : +650.00|Vitres AR privatives : +390.00";
$tab_liste = explode("|", $liste);

foreach($tab_liste as $option) {
    // regex here 
}

EDIT : How can I do in PHP to retrieve first the option name, second the operator and third the decimal number ? Thanks.

Pablo DelaNoche
  • 677
  • 1
  • 9
  • 28

3 Answers3

1

You don't even need to use explode() here, because preg_match_all can handle doing multiple regex matches across a given input string:

$liste = "Pack Eclairage : Lave-phares Projecteurs Bi-X\u00e9non 35W directionnels Feux AV eclairage diurne LED : -400.00Etriers de freins Rouge : +200.00|Jantes en alliage 19\" Performance Noires (avec Pneus Run-On Flat) : +900.00|Pack Confort : Syst\u00e8me d'entr\u00e9e sans cl\u00e9s (conducteur et passager) Eclairage des poign\u00e9es de portes Compartiment porte-objets c\u00f4t\u00e9 conducteur Pare-soleil conducteur avec illumination : +580.00|Peinture Pastel Extra-s\u00e9rie Blanc Alfa : +650.00|Vitres AR privatives : +390.00";
preg_match_all ("/([+\-])(\d+(\.\d+)?)/", $liste, $array);

for ($i=0; $i < count($array[1]); $i++) {
    echo $array[1][$i] . ", " . $array[2][$i] . "\n";
}

-, 400.00
+, 200.00
+, 900.00
+, 580.00
+, 650.00
+, 390.00

Demo

Tim Biegeleisen
  • 502,043
  • 27
  • 286
  • 360
1

You can do with regex /[+-]\d+\.?\d*/m

<?php
$re = '/[+-]\d+\.?\d*/m';
$str = 'Pack Eclairage : Lave-phares Projecteurs Bi-X\\u00e9non 35W directionnels Feux AV eclairage diurne LED : -400.00Etriers de freins Rouge : +200.00|Jantes en alliage 19\\" Performance Noires (avec Pneus Run-On Flat) : +900.00|Pack Confort : Syst\\u00e8me d\'entr\\u00e9e sans cl\\u00e9s (conducteur et passager) Eclairage des poign\\u00e9es de portes Compartiment porte-objets c\\u00f4t\\u00e9 conducteur Pare-soleil conducteur avec illumination : +580.00|Peinture Pastel Extra-s\\u00e9rie Blanc Alfa : +650.00|Vitres AR privatives : +390.00';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
$result = call_user_func_array('array_merge',$matches);
print_r($result);
?>

Output

Array ( 
 [0] => -400.00 
 [1] => +200.00
 [2] => +900.00 
 [3] => +580.00 
 [4] => +650.00 
 [5] => +390.00
)

DEMO : https://3v4l.org/X2DK6

A l w a y s S u n n y
  • 36,497
  • 8
  • 60
  • 103
0
    $liste = "Pack Eclairage : Lave-phares Projecteurs Bi-X\u00e9non 35W directionnels Feux AV eclairage diurne LED : -400.00Etriers de freins Rouge : +200.00|Jantes en alliage 19\" Performance Noires (avec Pneus Run-On Flat) : +900.00|Pack Confort : Syst\u00e8me d'entr\u00e9e sans cl\u00e9s (conducteur et passager) Eclairage des poign\u00e9es de portes Compartiment porte-objets c\u00f4t\u00e9 conducteur Pare-soleil conducteur avec illumination : +580.00|Peinture Pastel Extra-s\u00e9rie Blanc Alfa : +650.00|Vitres AR privatives : +390.00";
    $tab_liste = explode("|", $liste);

    foreach($tab_liste as $option) {
        preg_match_all("#((\-|\+)[\d\.]+)#", $option, $matches);
       var_dump($matches[0]);
       echo "<br>";
    }
Oto Shavadze
  • 40,603
  • 55
  • 152
  • 236