PHP Parsen, abgleichen, ersetzen

Amschti

Erfahrenes Mitglied
Hallo Zusammen . ich überlege mir seid einigen tagen wie ich einen String erstellen kann, der sich danach automatisch parsen lässt um eine pdf seite zu erstellen.

Mir fehlt aber immer noch die gewisse Logik wie ich da vorgehen muss.

Also angenommen ein String sieht inetwa so aus:


PHP:
$String = "Guten tag [k:anrede] [k:name] 

Unsere Firma [h:firmenname] freut es, ihnen das Produkt [p:name] offerieren zu dürfen.";


Nun zur erklärung, die in Klammern gesetzte zeichen sollen per regulären ausdrücken etc. ausgelesen werden und über die db ausgelesen werden. Wobei das erste zeichen vor dem doppelpunkt die db angibt und die zweite die spalte.

Welche funktionen können da hilfreich sein? preg_replace() ?? irgendwie fehlt mir einfach die logik der vorgehensweise.
 
Du kannst es mit preg_replace_callback probieren:
PHP:
$string = 'Guten tag [k:anrede] [k:name]

Unsere Firma [h:firmenname] freut es, ihnen das Produkt [p:name] offerieren zu dürfen.';

$result = preg_replace_callback( '/\[([a-z]+):([a-z]+)\]/', function ( $matches ) {
  list( $match, $table, $column ) = $matches;

  # mach irgendwas mit $table und $column
}, $string );
 
Grundsätzlich mit preg_replace_callback
Aber, woher soll der Code wissen, welche Kunden - Anbieter - Produktkombination auszuwählen ist?

PHP:
$string = 'Guten tag [k:anrede] [k:name]

Unsere Firma [h:firmenname] freut es, ihnen das Produkt [p:name] offerieren zu dürfen.';

echo preg_replace_callback('/\[(\w+):(\w+)\]/', 'parse', $string);

function parse($matches){
  //Simulation der DB
  //$db_simulation[tabelle][spalte][zeile]
  $db_simulation['h']['firmenname'][0] = 'ERB software';
  $db_simulation['h']['firmenname'][1] = 'Maier Unternehmsabrung GMBH';

  $db_simulation['k']['anrede'][0] = 'Herr';
  $db_simulation['k']['name'][0] = 'Müller';
  $db_simulation['k']['anrede'][1] = 'Frau';
  $db_simulation['k']['name'][1] = 'Ernst';
  $db_simulation['k']['anrede'][2] = 'Firma';
  $db_simulation['k']['name'][2] = 'Kambler Bankrottierungsgesellschaft';

  $db_simulation['p']['name'][0] = 'YFilter';
  $db_simulation['p']['name'][1] = 'Irgendwas';
  $db_simulation['p']['name'][2] = 'Rasenmäher';
  $db_simulation['p']['name'][3] = 'Faule Hypotheken';
  //Daten aus der DB auslesen und zurückgeben. $matches[1] ist die Tabelle, $matches[2] das Feld
  //Es fehlt die Angabe der Zeile. Ich nehm mal einfach überall Zeile 0
  return $db_simulation[$matches[1]][$matches[2]][0];

}

Ausgabe
Code:
Guten tag Herr Müller
Unsere Firma ERB software freut es, ihnen das Produkt YFilter offerieren zu dürfen.
 
Mist! Sorry jungs/mädels, anscheinend bekomme ich keine Mail mehr wenn ich hier nicht online bin....

Anstatt zu warten habe ich mich durch den googlewald durchgeschlagen und bin zu dem funktionierendem Ergebnis gekommen.....
PHP:
<?php
include("../../mysql.php");

//$id_projekt = $_POST["id_projekt"];
//$id_pdf = $_POST['id_pdf'];
$id_projekt=1;
$id_pdf=1;

$query = mysql_query("SELECT * FROM gd_bestellung  WHERE id_projekt = '$id_projekt'");
$bestellung = mysql_fetch_assoc($query);
$id_handler = $bestellung['id_handler'];
$id_handler_user = $bestellung['id_handler_user'];
$id_lieferant = $bestellung['id_lieferant'];
$id_kunde = $bestellung['id_kunde'];
//echo $id_kunde.'=<br />';

$query = mysql_query("SELECT * FROM gd_sm_pdf WHERE id = '$id_pdf'");
$pdf = mysql_fetch_assoc($query);
//echo mysql_error();
$query = mysql_query("SELECT * FROM gd_sm_pdf_details WHERE id_sm_pdf = $pdf[id]");
while($pdf_details = mysql_fetch_assoc($query)){
  $str = array();
  $arr = array();
    $subject = $pdf_details['text'];
     echo 'Original = '.$subject;

    $pattern = '!\[\w:\w+\]!i';
    $result = preg_match_all($pattern, $subject, $subpattern, PREG_SET_ORDER);

   for($i=0;$i<$result;$i++){
   array_push($str,$subpattern[$i][0]);
   $clear = array("[","]");
   $string =str_replace($clear,"",$subpattern[$i][0]);
   list($db,$tbl) = split(":",$string);
//       echo $db.' / '.$tbl;


       if($db=="k"){$thisid= $id_kunde;}
       else if($db=="h"){$thisid= $id_handler;}
       else if($db=="l"){$thisid= $id_lieferant;}
       $q = mysql_query("SELECT * FROM gd_benutzer WHERE id = '$thisid'");
       $ersatz = mysql_fetch_assoc($q);
//       echo '--'.$ersatz[$tbl].'</br>';

       array_push($arr,$ersatz[$tbl]);

   }

$newstring =   str_replace($str,$arr,$subject);
   echo '<br />ERGEBNIS = '.$newstring.'<hr /><br />'; unset($arr);unset($str);
}
// echo mysql_error();

?>
 
Kannst Du schon so machen, aber dann ist es alles andere als sauber. Ich muss hier einfach eines meiner Lieblingszitate zum Thema Programmieren einwerfen:
Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.
 
Nicht nur unsauber, sondern auch veraltet und unsicher. Wechsel zu MySQLi (mit Prepared Statements) oder PDO. Die MySQL-Erweiterung (mysql_*) ist veraltet.
 
Zurück