stinol: preg_match_all und reguläre Ausdrücke

Hallo alle zusammen,

seit zwei Stunden versuche ich mit preg_match_all eine Sache hinzubekommen.
Meine Aufgabe ist der String

$str = "Fahrzeug-Nr.: 66666.\**Ausstattungslinie/ -paket:**\Beschreibung des Paketes 1.\**Media:**\Beschreibung des Paketes 2.\**Komfort:**\Beschreibung des Paketes 3.\**Assistenzsysteme:**\Beschreibung des Paketes 4.\**Exterieur:**\Beschreibung des Paketes 5.\**Interieur:**\Beschreibung des Paketes 6.\**Gepäck- / Ladehilfen:**\Beschreibung des Paketes 7.\**Sicherheit:**\Beschreibung des Paketes 8.\**Abgasreinigung / Umwelt:**\Beschreibung des Paketes 9.\**Garantie:**\Beschreibung des Paketes 10.\**Sonstiges:**\Beschreibung des Paketes 11.\----**Beschreibung des Produktes ABC.**";

so zu zerlegen(nicht unbedingt mit preg_match_all, aber ich habe keine bessere Funktion gefunden), dass am Ende ein Array rauskommt

Array(
"Fahrzeug-Nr.: 66666." => Array (
"Ausstattungslinie/ -paket:" => "Beschreibung des Paketes 1.",
"Media:" => "Beschreibung des Paketes 2.",
"Komfort:" => "Beschreibung des Paketes 3.",
"Assistenzsysteme:" => "Beschreibung des Paketes 4.",
"Exterieur:" => "Beschreibung des Paketes 5.",
"Interieur:" => "Beschreibung des Paketes 6.",
"Gepäck- / Ladehilfen:" => "Beschreibung des Paketes 7.",
"Sicherheit:" => "Beschreibung des Paketes 8.",
"Abgasreinigung / Umwelt:" => "Beschreibung des Paketes 9.",
"Garantie:" => "Beschreibung des Paketes 10.",
"Sonstiges:" => "Beschreibung des Paketes 11.",
"----" => "Beschreibung des Produktes ABC."
)
)

Meine Frage wäre: ist das überhaupt machbar mit einer Funktion? Wenn, ja, würde ich gern eure Lösungen sehen. Vielen Dank im Voraus

  1. Liebe(r) stinol,

    was hast Du bisher probiert, was ist dabei herausgekommen und was hättest Du stattdessen erwartet?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Hallo!

    seit zwei Stunden versuche ich mit preg_match_all eine Sache hinzubekommen.

    Da ich persönlich Regex wo immer möglich gerne vermeide, habe ich mir deinen Ausgangsstring und das gewünschte Array einmal genauer angeguckt. Dabei fällt auf, dass im Prinzip nur der erste Teil (Fahrzeug-Nr.: 66666.), sowie der letzte (----**Beschreibung des Produktes ABC.**) aus dem ansonsten konsistenten Schema

    • Array-Eintrag fängt nach "\**" an (und geht bis zum nächsten Vorkommen)
    • Schlüssel liegt zwischen "\**" und "**\"
    • Wert ist der Teil nach "**\"

    Wann immer man das oder die gleichen Zeichenfolge(n) als Separator(en) findet, kann man die Funktion 'explode' verwenden.

    Bleibt also nur die "Sonderbehandlung" des ersten und letzten Teils, die sich hier aber auch nicht als sehr schwierig erweist.

    Hier mal mein "Schnellschuss" (extra noch mit allen "Kontrollausgaben" im Quelltext):

      
    <?php  
    $str = "Fahrzeug-Nr.: 66666.\\**Ausstattungslinie/ -paket:**\\Beschreibung des Paketes 1.\\**Media:**\\Beschreibung des Paketes 2.\\**Komfort:**\\Beschreibung des Paketes 3.\\**Assistenzsysteme:**\\Beschreibung des Paketes 4.\\**Exterieur:**\\Beschreibung des Paketes 5.\\**Interieur:**\\Beschreibung des Paketes 6.\\**Gepäck- / Ladehilfen:**\\Beschreibung des Paketes 7.\\**Sicherheit:**\\Beschreibung des Paketes 8.\\**Abgasreinigung / Umwelt:**\\Beschreibung des Paketes 9.\\**Garantie:**\\Beschreibung des Paketes 10.\\**Sonstiges:**\\Beschreibung des Paketes 11.\\----**Beschreibung des Produktes ABC.**";  
      
    $pos_last = strrpos($str, "\\");  
    $last_str = substr($str, $pos_last+1);  
    //echo"last_str: $last_str<br>\n";  
      
    $last_parts = explode("**", $last_str);  
    //print_r($last_parts);  
      
    $str = substr($str, 0 ,$pos_last);  
    //echo"str: $str<br>\n"; exit;  
      
    $parts = explode("\\**", $str);  
    //print_r($parts);  
      
    $fahrzeuge = array();  
    $fahrzeuge[$parts[0]] = array();  
    $index = array_shift($parts);  
    //print_r($parts);  
      
    foreach($parts as $val) {  
    	//echo"V: $val<br>\n";  
    	$temps = explode("**\\", $val);  
    	//print_r($temps); echo"<br>\n";  
    	$fahrzeuge[$index][$temps[0]] = $temps[1];  
    }  
      
    $fahrzeuge[$index][$last_parts[0]] = $last_parts[1];  
      
    print_r($fahrzeuge);  
    ?>  
    
    

    Liefert folgende Ausgabe:

      
    Array  
    (  
        [Fahrzeug-Nr.: 66666.] => Array  
            (  
                [Ausstattungslinie/ -paket:] => Beschreibung des Paketes 1.  
                [Media:] => Beschreibung des Paketes 2.  
                [Komfort:] => Beschreibung des Paketes 3.  
                [Assistenzsysteme:] => Beschreibung des Paketes 4.  
                [Exterieur:] => Beschreibung des Paketes 5.  
                [Interieur:] => Beschreibung des Paketes 6.  
                [Gepäck- / Ladehilfen:] => Beschreibung des Paketes 7.  
                [Sicherheit:] => Beschreibung des Paketes 8.  
                [Abgasreinigung / Umwelt:] => Beschreibung des Paketes 9.  
                [Garantie:] => Beschreibung des Paketes 10.  
                [Sonstiges:] => Beschreibung des Paketes 11.  
                [----] => Beschreibung des Produktes ABC.  
            )  
      
    )  
    
    

    Und ganz ohne reguläre Ausdrücke ...! ;-)

    Gruß Gunther

    1. Hallo!

      seit zwei Stunden versuche ich mit preg_match_all eine Sache hinzubekommen.

      Da ich persönlich Regex wo immer möglich gerne vermeide, habe ich mir deinen Ausgangsstring und das gewünschte Array einmal genauer angeguckt. Dabei fällt auf, dass im Prinzip nur der erste Teil (Fahrzeug-Nr.: 66666.), sowie der letzte (----**Beschreibung des Produktes ABC.**) aus dem ansonsten konsistenten Schema

      • Array-Eintrag fängt nach "\**" an (und geht bis zum nächsten Vorkommen)
      • Schlüssel liegt zwischen "\**" und "**\"
      • Wert ist der Teil nach "**\"

      Wann immer man das oder die gleichen Zeichenfolge(n) als Separator(en) findet, kann man die Funktion 'explode' verwenden.

      Bleibt also nur die "Sonderbehandlung" des ersten und letzten Teils, die sich hier aber auch nicht als sehr schwierig erweist.

      Hier mal mein "Schnellschuss" (extra noch mit allen "Kontrollausgaben" im Quelltext):

      <?php
      $str = "Fahrzeug-Nr.: 66666.\Ausstattungslinie/ -paket:\Beschreibung des Paketes 1.\Media:\Beschreibung des Paketes 2.\Komfort:\Beschreibung des Paketes 3.\Assistenzsysteme:\Beschreibung des Paketes 4.\Exterieur:\Beschreibung des Paketes 5.\Interieur:\Beschreibung des Paketes 6.\Gepäck- / Ladehilfen:\Beschreibung des Paketes 7.\Sicherheit:\Beschreibung des Paketes 8.\Abgasreinigung / Umwelt:\Beschreibung des Paketes 9.\Garantie:\Beschreibung des Paketes 10.\Sonstiges:\Beschreibung des Paketes 11.\----Beschreibung des Produktes ABC.";

      $pos_last = strrpos($str, "\");
      $last_str = substr($str, $pos_last+1);
      //echo"last_str: $last_str<br>\n";

      $last_parts = explode("**", $last_str);
      //print_r($last_parts);

      $str = substr($str, 0 ,$pos_last);
      //echo"str: $str<br>\n"; exit;

      $parts = explode("\**", $str);
      //print_r($parts);

      $fahrzeuge = array();
      $fahrzeuge[$parts[0]] = array();
      $index = array_shift($parts);
      //print_r($parts);

      foreach($parts as $val) {
      //echo"V: $val<br>\n";
      $temps = explode("**\", $val);
      //print_r($temps); echo"<br>\n";
      $fahrzeuge[$index][$temps[0]] = $temps[1];
      }

      $fahrzeuge[$index][$last_parts[0]] = $last_parts[1];

      print_r($fahrzeuge);
      ?>

      
      > Liefert folgende Ausgabe:  
      > ~~~html
        
      
      > Array  
      > (  
      >     [Fahrzeug-Nr.: 66666.] => Array  
      >         (  
      >             [Ausstattungslinie/ -paket:] => Beschreibung des Paketes 1.  
      >             [Media:] => Beschreibung des Paketes 2.  
      >             [Komfort:] => Beschreibung des Paketes 3.  
      >             [Assistenzsysteme:] => Beschreibung des Paketes 4.  
      >             [Exterieur:] => Beschreibung des Paketes 5.  
      >             [Interieur:] => Beschreibung des Paketes 6.  
      >             [Gepäck- / Ladehilfen:] => Beschreibung des Paketes 7.  
      >             [Sicherheit:] => Beschreibung des Paketes 8.  
      >             [Abgasreinigung / Umwelt:] => Beschreibung des Paketes 9.  
      >             [Garantie:] => Beschreibung des Paketes 10.  
      >             [Sonstiges:] => Beschreibung des Paketes 11.  
      >             [----] => Beschreibung des Produktes ABC.  
      >         )  
      >   
      > )  
      > 
      
      

      Und ganz ohne reguläre Ausdrücke ...! ;-)

      Gruß Gunther

      Ich danke dich, Gunther. Ich mag auch nicht reguläre Ausdrücke :-)