Probleme mit preg_match() und preg_split()

BLC

Grünschnabel
Hallo,



habe eine Zeichenkette, die ungefähr so aussieht
PHP:
{38|canvas|40x40||Farbe|1}{40|Foto-Tasse|||S/W|1}{39|photo|24x30|matt|S/W|1}

Es handelt sich dabei um Informationen zu Bildern. Start- und Endpunkte eines Bildes sind die geschweiften Klammern. Innerhalb einer Bildinformation sind die einzelnen Infos mittels "|" von einander getrennt. Die Infos müssen allerdings nicht zwangsläufig gesetzt werden, so dass auch 2 oder mehr "|" aufeinander folgen können.

Ziel soll es sein, die einzelnen Werte auflisten zu können.

Ich versuche sie zunächst aufzuspalten:
PHP:
$images = preg_split('/{*}/i', $result['images']);
Hier treten die ersten beide Problem auf... Zum einen frisst das Skript die 2. geschweifte Klammer. Zum anderen erzeugt er als Letztes einen leeren Array-Teil.


Weiter geht's mit der Auflistung:
PHP:
for ($x = 0; $x < sizeof($images); ++$x) {
						preg_match('/(?P<image>\w*)\|(?P<type>\w*)\|(?P<size>\w*)\|(?P<paper>\w*)\|(?P<colour>\w*)\|(?P<quantity>\d+)/', current($images), $match);
						$list .= "<tr>";
						$list .= "<td style=\"padding: 3px 0;\">". $match[quantity] ."x</td>";
						$list .= "<td>". $match[image] ."</td>";
						$list .= "<td>". $match[type] .", ". $match[size] .", ". $match[paper] ."</td>";
						$list .= "<td>". $match[colour] ."</td>";
						$list .= "</tr>";
						next($images);
					}

Der "w"-Operator unterdrückt Sonderzeichen, wie das "/", was er jedoch nicht soll. Ich weiß keine Möglichkeit ihn so zu modifizieren, dass er auch einen "/" oder ein "-" zulässt, bzw. an welcher Stelle ich das "/" und das "-" maskieren kann.

Weiß jemand Rat? 1000 Dank im vorraus... Quäle mich seit ca. 6h damit rum...
 
Ich denke mal es liefert das was du haben willst, weiß nur nicht ob ich mal wieder zu kompliziert denke:

PHP:
<?php
$werte = "{38|canvas|40x40||Farbe|1}{40|Foto-Tasse|||S/W|1}{39|photo|24x30|matt|S/W|1}";

$wert = explode("}{", $werte);

//verbleibende geschweifte Klammern entfernen und Werte aufschlüsseln
for ($a = 0; $a < count($wert); $a++) {
    $wert[$a] = str_replace("{", "", $wert[$a]);
    $wert[$a] = str_replace("}", "", $wert[$a]);
    $wert[$a] = explode("|", $wert[$a]);
//Arrayschlüssel vergeben
    $wert[$a] = array(
                "image"=>$wert[$a][0],
                "type"=>$wert[$a][1],
                "size"=>$wert[$a][2],
                "paper"=>$wert[$a][3],
                "colour"=>$wert[$a][4],
                "quantity"=>$wert[$a][5]
                );
}

var_dump($wert[0]);

echo "<br />";

var_dump($wert[1]);

echo "<br />";

var_dump($wert[2]);
?>
 
Zuletzt bearbeitet:
Folgendes pattern:
PHP:
$pattern = '/{([^|}]*)\|([^|}]*)\|([^|}]*)\|([^|}]*)\|([^|}]*)\|([^|}]*)\}/';

Ergibt mit PREG_PATTERN_ORDER:
Code:
array
  0 => 
    array
      0 => string '{38|canvas|40x40||Farbe|1}' (length=26)
      1 => string '{40|Foto-Tasse|||S/W|1}' (length=23)
      2 => string '{39|photo|24x30|matt|S/W|1}' (length=27)
  1 => 
    array
      0 => string '38' (length=2)
      1 => string '40' (length=2)
      2 => string '39' (length=2)
  2 => 
    array
      0 => string 'canvas' (length=6)
      1 => string 'Foto-Tasse' (length=10)
      2 => string 'photo' (length=5)
  3 => 
    array
      0 => string '40x40' (length=5)
      1 => string '' (length=0)
      2 => string '24x30' (length=5)
  4 => 
    array
      0 => string '' (length=0)
      1 => string '' (length=0)
      2 => string 'matt' (length=4)
  5 => 
    array
      0 => string 'Farbe' (length=5)
      1 => string 'S/W' (length=3)
      2 => string 'S/W' (length=3)
  6 => 
    array
      0 => string '1' (length=1)
      1 => string '1' (length=1)
      2 => string '1' (length=1)

Oder eben mit PREG_SET_ORDER
Code:
array
  0 => 
    array
      0 => string '{38|canvas|40x40||Farbe|1}' (length=26)
      1 => string '38' (length=2)
      2 => string 'canvas' (length=6)
      3 => string '40x40' (length=5)
      4 => string '' (length=0)
      5 => string 'Farbe' (length=5)
      6 => string '1' (length=1)
  1 => 
    array
      0 => string '{40|Foto-Tasse|||S/W|1}' (length=23)
      1 => string '40' (length=2)
      2 => string 'Foto-Tasse' (length=10)
      3 => string '' (length=0)
      4 => string '' (length=0)
      5 => string 'S/W' (length=3)
      6 => string '1' (length=1)
  2 => 
    array
      0 => string '{39|photo|24x30|matt|S/W|1}' (length=27)
      1 => string '39' (length=2)
      2 => string 'photo' (length=5)
      3 => string '24x30' (length=5)
      4 => string 'matt' (length=4)
      5 => string 'S/W' (length=3)
      6 => string '1' (length=1)

//edit
Natürlich mit preg_match_all() und nicht mit preg_match()
 
Zuletzt bearbeitet:
Zurück