networkinghomer
Goto Top

Doppelpunkt bricht Inhalt ab

Hallo!
Wenn ein User in seinen Termin-Text einen Doppelpunkt einbaut, z.b.:

"Folgendes: Bla bla..."

wird der Text ab "Folgendes" abgeschnitten.

Woran kann das grundsätzlich in PHP und HTML liegen? Umlaute werden korrekt angezeigt.

Liebe Grüße
Homer

Content-Key: 215959

Url: https://administrator.de/contentid/215959

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: Hitman4021
Hitman4021 03.09.2013 um 12:31:21 Uhr
Goto Top
Hallo,

Wenn ein User in seinen Termin-Text einen Doppelpunkt einbaut, z.b.:
"Folgendes: Bla bla..."
wird der Text ab "Folgendes" abgeschnitten.
Und wie sieht das Script dazu aus?
Wird es bereits bei der Eingabe falsch angezeigt?
Datenbank?
JavaScript?

Umlaute werden korrekt angezeigt
Ok dein Character Set stimmt schon mal.

Gruß
Mitglied: falscher-sperrstatus
falscher-sperrstatus 03.09.2013 um 12:38:50 Uhr
Goto Top
Skript? Nicht sauber escaped?
Mitglied: NetworkingHomer
NetworkingHomer 03.09.2013 um 12:39:09 Uhr
Goto Top
Moin,

das ist ein PHP-Script, es liest einen iCal-Link. In der Eingabe (im Kalender) wird es korrekt angezeigt. Der ICal-Export geht auch, da der Termin in Outlook korrekt angezeigt wird. Einze Zeile, die das verursacht, sieht z.B. so aus:

$nc .= "" . $event->description . "";

Es wird dann später mit print angezeigt.

Liebe Güße
Homer
Mitglied: falscher-sperrstatus
falscher-sperrstatus 03.09.2013 um 12:41:15 Uhr
Goto Top
Wenn du Hilfe willst gib uns >>vollständige<< Informationen. D.h. das komplette Skriptabriss. Andernfalls lässt sich das Problem schwer herleiten.

aus einem $var = $x->y wird man bei keinem 5 Zeilen Problemskript schlau.
Mitglied: NetworkingHomer
NetworkingHomer 03.09.2013 aktualisiert um 14:20:02 Uhr
Goto Top
Okay.
<?php
/* iCal Parser - Some PHP functions to parse an iCal calendar into a usable PHP object.
 *               Also convert the object into pretty HTML.
 *
 * Copyright (C) 2006 Adam Wolfe Gordon
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

// Blatantly stolen from http://ca3.php.net/manual/en/function.xml-parse-into-struct.php
// Convert xml into a nice object
class XmlElement {
  var $name;
  var $attributes;
  var $content;
  var $children;
};

function xml_to_object($xml) {
  $parser = xml_parser_create();
  xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
  xml_parse_into_struct($parser, $xml, $tags);
  xml_parser_free($parser);
  
  $elements = array();  // the currently filling [child] XmlElement array
  $stack = array();
  foreach ($tags as $tag) {
    $index = count($elements);
    if ($tag['type'] == "complete" || $tag['type'] == "open") {  
      $elements[$index] = new XmlElement;
      $elements[$index]->name = $tag['tag'];  
      $elements[$index]->attributes = $tag['attributes'];  
      $elements[$index]->content = $tag['value'];  
      if ($tag['type'] == "open") {  // push  
	$elements[$index]->children = array();
	$stack[count($stack)] = &$elements;
	$elements = &$elements[$index]->children;
      }
    }
    if ($tag['type'] == "close") {  // pop  
      $elements = &$stack[count($stack) - 1];
      unset($stack[count($stack) - 1]);
    }
  }
  return $elements;  // the single top-level element
}

// Not stolen
// Fetch text from an iCal URL and convert it into xml
function ical2xml($URL) {
  $myfile = file_get_contents($URL);
  
  $myfile = str_replace("\n ", "", $myfile);  
  $myfile = str_replace("&", " and ", $myfile);  
  $mylines = split("\n", $myfile);  
  
  $xml = "";	  
  foreach($mylines as $line) {
    if($line == "")  
      continue;
    
    list($key,$val) = split(":", $line);  
    $key = trim($key, "\r\n");  
    $val = trim($val, "\r\n");  
    $val = str_replace("\n", "", $val);  
    $val = str_replace("\r", "", $val);  
    
    $attribs = split(";", $key);  
    $key = $attribs;
    $attribs = array_slice($attribs, 1);
    
    $myattribs = " ";  
    foreach($attribs as $attrib) {
      list($att, $attval) = split("=", $attrib);  
      $myattribs .= "$att=\"$attval\" ";  
    }
    $myattribs = rtrim($myattribs);
    
    // BEGIN and END keywords
    if($key == 'BEGIN') {  
      $xml .= "<$val$myattribs>\n";  
    } else if($key == 'END') {  
      $xml .= "</$val>\n";  
    } else {
      $xml .= "<$key$myattribs>$val</$key>\n";  
    }
  }
  
  return $xml;
}

// Event class
class event {
  var $starttime;
  var $endtime;
  var $allday;
  var $rrulefreq;
  var $rruledays;
  var $rruleuntil;
  var $description;
  var $location;
  var $summary;
};

// Calendar class
class calendar {
  var $name;
  var $timezone;
  var $description;
  var $events = array();
};

// Timezone class
class timezone {
  var $namestd;
  var $namedst;
  var $offsetstd;
  var $offsetdst;
};

// Convert a time in iCal's ugly format to a unix timestamp 
function ical_time_to_timestamp($time) {
  $hour = substr($time, 9, 2);
  if($hour == "")  
    $hour = 0;
  $min = substr($time, 11, 2);
  if($min == "")  
    $min = 0;
  $sec =  substr($time, 13, 2);
  if($sec == "")  
    $sec = 0;
  $mon = substr($time, 4, 2);
  $day = substr($time, 6, 2);
  $year = substr($time, 0, 4);
  return mktime($hour, $min, $sec, $mon, $day, $year);
}

// The day the world ends (for Unix users)
$endoftime = ical_time_to_timestamp("20380118T000000");  

// Event comparison function for sorting
function cmp($a, $b) {
  if(!(is_object($a) && is_object($b)))
    return 0;
  if($a->starttime == $b->starttime)
    return 0;
  return ($a->starttime < $b->starttime) ? -1 : 1;
}

// Convert XML into a calendar object
function xml_to_calendar($xml) {
  $mycal = new calendar;
  $eventcount = 0;
  
  $thecal = xml_to_object($xml);
  
  foreach($thecal->children as $child) {
    switch($child->name) {
    case "X-WR-CALNAME":  
      $mycal->name = $child->content;
      break;
    case "X-WR-CALDESC":  
      $mycal->description = $child->content;
      break;
    case "VTIMEZONE":  
      $mycal->timezone = new timezone;
      foreach($child->children as $data) {
	switch($data->name) {
	case "STANDARD":  
	  foreach($data->children as $sec) {
	    switch($sec->name) {
	    case "TZNAME":  
	      $mycal->timezone->namestd = $sec->content;
	      break;
	    case "TZOFFSETTO":  
	      $mycal->timezone->offsetstd = $sec->content;
	      break;
	    default:
	      break;
	    }
	  }
	  break;
	case "DAYLIGHT":  
	  foreach($data->children as $sec) {
	    switch($sec->name) {
	    case "TZNAME":  
	      $mycal->timezone->namedst = $sec->content;
	      break;
	    case "TZOFFSETTO":  
	      $mycal->timezone->offsetdst = $sec->content;
	      break;
	    default:
	      break;
	    }
	  }
	  break;
	default:
	  break;
	}
      }
      break;
    case "VEVENT":  
      $i = $eventcount;
      $mycal->events[$i] = new event;
      $mycal->events[$i]->allday = FALSE;
      $eventcount++;
      foreach($child->children as $data) {
	switch($data->name) {
	case "DTSTART":  
	  if(substr($data->content, 9, 6) == "") {  
	    $mycal->events[$i]->allday = TRUE;
	    $mycal->events[$i]->starttime = ical_time_to_timestamp($data->content . "T000000");  
	  } else
	    $mycal->events[$i]->starttime = ical_time_to_timestamp($data->content);
	  break;
	case "DTEND":  
	  if(substr($data->content, 9, 6) == "") {  
	    $mycal->events[$i]->allday = TRUE;
	    $mycal->events[$i]->endtime = ical_time_to_timestamp($data->content . "T000000");  
	  } else
	    $mycal->events[$i]->endtime = ical_time_to_timestamp($data->content);
	  break;
	case "DURATION":  
	  $mycal->events[$i]->endtime = $mycal->events[$i]->starttime + substr($data->content, 2, strlen($data->content) - 1);
	  break;
	case "RRULE":  
	  $myrrule = split(";", $data->content);  
	  // Unless otherwise specified, repeating events go until the end of time
	  $mycal->events[$i]->rruleuntil = $endoftime;
	  foreach($myrrule as $part) {
	    list($a, $b) = split("=", $part);  
	    switch($a) {
	    case "FREQ":  
	      $mycal->events[$i]->rrulefreq = $b;
	      break;
	    case "BYDAY":  
	      $mycal->events[$i]->rruledays = $b;
	      break;
	    case "UNTIL":  
	      $mycal->events[$i]->rruleuntil = ical_time_to_timestamp($b);
	      break;
	    default:
	      break;
	    }
	  }
	  break;
	case "DESCRIPTION":  
          $mycal->events[$i]->description = str_replace("\\n", "<br />", $data->content);  
	  break;
	case "LOCATION":  
	  $mycal->events[$i]->location = $data->content;
	  break;
	case "SUMMARY":  
	  $mycal->events[$i]->summary = $data->content;
	  break;
	default:
	  break;
	}
      }
      break;
    default:
      break;
    }
  }

  // Sort events by start date/time
  usort($mycal->events, "cmp");  
  
  return $mycal;
}

// Take in an iCal object and spit out pretty HTML.
function objToHTML($thecal) {
  // Days of the week
  $shortdays = array(	"MO"=>"Monday",  
			"TU"=>"Tuesday",  
			"WE"=>"Wednesday",  
			"TH"=>"Thursday",  
			"FR"=>"Friday",  
			"SA"=>"Saturday",  
			"SU"=>"Sunday"  
			);

  // Global variables from the config file
  global $timeformat;
  global $dateformat;
  global $noyearformat;
  global $nodayformat;
  global $xthday;

  $nc = "<ul>";  
  foreach($thecal->events as $event) {
    if($event->starttime > time() || ($event->rrulefreq && (time() < $event->rruleuntil || $event->rruleuntil == $endoftime))) {
      $nc .= "<li><b>" . $event->summary . "</b><br />\n";  
      
      if($event->rrulefreq == "WEEKLY") {  
	$days = str_replace(",", ", ", $event->rruledays);  
	$repdays = split(",", $event->rruledays);  
	foreach($repdays as $repday) {
	  $days = str_replace($repday, $shortdays[$repday], $days);
	}
	
	$prefix = "Every week on $days";  
	
	if($event->starttime > time()) {
	  if($event->allday == FALSE) {
	    $fromto = " starting " . date($dateformat, $event->starttime) . " from " . date($timeformat, $event->starttime) . " to " . date($timeformat, $event->endtime);  
	  } else {
	    $fromto = " all day starting " . date($dateformat, $event->starttime);  
	  }
	} else {
	  if($event->allday == FALSE) {
	    $fromto = " from " . date($timeformat, $event->starttime) . " to " . date($timeformat, $event->endtime);  
	  } else {
	    $fromto = ", all day";  
	  }
	}
	
	if($event->rruleuntil != $endoftime) {
	  $until = " until " . date($dateformat, $event->rruleuntil);  
	} else {
	  $until = "";  
	}
      } else if($event->rrulefreq == "MONTHLY") {  
	$prefix = "The " . date($xthday, $event->starttime) . " day of each month";  
	
	if($event->starttime > time()) {
	  if($event->allday == FALSE) {
	    $fromto = " starting " . date($nodayformat, $event->starttime) . " from " . date($timeformat, $event->starttime) . " to " . date($timeformat, $event->endtime);  
	  } else {
	    $fromto = " starting " . date($nodayformat, $event->starttime);  
	  }
	} else {
	  if($event->allday == FALSE) {
	    $fromto = " from " . date($timeformat, $event->starttime) . " to " . date($timeformat, $event->endtime);  
	  } else {
	    $fromto = ", all day";  
	  }
	}
	
	if($event->rruleuntil != $endoftime) {
	  $until = " until " . date($nodayformat, $event->rruleuntil);  
	} else {
	  $until = "";  
	}
      } else if($event->rrulefreq == "DAILY") {  
	$prefix = "Every day";  
	
	if($event->starttime > time()) {
	  if($event->allday == FALSE) {
	    $fromto = " starting " . date($dateformat, $event->starttime) . " from " . date($timeformat, $event->starttime) . " to " . date($timeformat, $event->endtime);  
	  } else {
	    $fromto = " all day starting " . date($dateformat, $event->starttime);  
	  }
	} else {
	  if($event->allday == FALSE) {
	    $fromto = " from " . date($timeformat, $event->starttime) . " to " . date($timeformat, $event->endtime);  
	  } else {
	    $fromto = " all day";  
	  }
	}
	
	if($event->rruleuntil != $endoftime) {
	  $until = " until " . date($dateformat, $event->rruleuntil);  
	} else {
	  $until = "";  
	}
      } else if($event->rrulefreq == "YEARLY") {  
	$prefix = "Annually on " . date($noyearformat, $event->starttime);  
	
	if($event->allday == FALSE) {
	  $fromto = " from " . date($timeformat, $event->starttime) . " to " . date($timeformat, $event->endtime);  
	} else {
	  $fromto = ", all day";  
	}
	
	if($event->rruleuntil != $endoftime) {
	  $until = " until " . date("Y", $event->rruleuntil);  
	} else {
	  $until = "";  
	}
      } else {
	$prefix = date($dateformat, $event->starttime);
	
	if($event->allday == FALSE) {
	  $fromto = " from " . date($timeformat, $event->starttime) . " to " . date($timeformat, $event->endtime);  
	} else {
	  $fromto = " all day";  
	}
	
	$until = "";  
      }
      
      $nc .= $prefix . $fromto . $until . "<br />\n";  
      
      if($event->location)
	$nc .= $event->location . "<br />\n";  
      $nc .= "<blockquote>" . $event->description . "</blockquote><br /></li>\n";  
    }
  }
  $nc .= "</ul>";  

  return $nc;
}
?>
Mitglied: NetworkingHomer
NetworkingHomer 03.09.2013 um 12:49:11 Uhr
Goto Top
Das ist aber nur der Auszug aus der engine/iCalParser.php
Es gibt natürlich noch andere Dateien. Man sich das Script komplett hier herunter laden:

http://www.xvx.ca/code/icalevents/iCalEvents-0.31-standalone.tar.gz
Mitglied: nxclass
nxclass 03.09.2013 aktualisiert um 13:00:31 Uhr
Goto Top
var_dump( $event->description );
$nc .= "" . $event->description . "";  
... prüfe mal ob der Inhalt an dieser Stelle noch "richtig" ist.

oft werden : für Platzhalter verwendet für Ersetzungen vorzunehmen oder später Parameter zu übergeben.

EDIT: schau mal da:
list($key,$val) = split(":", $line);  
Mitglied: colinardo
colinardo 03.09.2013 um 12:57:52 Uhr
Goto Top
Hi Homer,
diese Zeile im Code ist verdächtig:
list($key,$val) = split(":", $line);
da werden Zeilen mit einem Doppelpunkt gesplittet

Grüße Uwe
Mitglied: NetworkingHomer
NetworkingHomer 03.09.2013 um 13:02:59 Uhr
Goto Top
Heiße Spur! Danke! face-smile Ich schaus mir sofort an - aber erst mal Tasse Kaffe machen
Mitglied: NetworkingHomer
NetworkingHomer 03.09.2013 um 13:13:33 Uhr
Goto Top
Okay, das wird wohl die Ursach sein.
Aber wie Abhilfe schaffen? Schaut so aus, als hätte der Autor das nicht ohne Grund gemacht. Hat wer eine Idee?
Mitglied: NetworkingHomer
NetworkingHomer 03.09.2013 um 13:16:47 Uhr
Goto Top
Vielleicht die ":" vorher herausfiltern und ersetzen?
Mitglied: colinardo
colinardo 03.09.2013 um 13:19:43 Uhr
Goto Top
Zitat von @NetworkingHomer:
Vielleicht die ":" vorher herausfiltern und ersetzen?
Das wird nicht gehen denn ein iCal-File trennt die Felder mit einem Doppelpunkt voneinander. Du müsstest vor dem parsen in dem File mit einer Regular Expression die jeweilige Description des Termins ausfiltern und "nur" dort den Doppelpunkt ersetzen.
Mitglied: NetworkingHomer
NetworkingHomer 03.09.2013 aktualisiert um 14:20:49 Uhr
Goto Top
Moin Colinardo!
Du hast recht! ":" geht nicht, aber ": " schon!

Yuhu! Es geht! Edit: Die Zeilen
  $myfile1 = file_get_contents($URL); (nur $myfile geändert)
  $myfile = (str_replace(": ","P", $myfile1)); (neu hinzugefügt)  
Stammen von mir:
function ical2xml($URL) {
  $myfile1 = file_get_contents($URL);
  $myfile = (str_replace(": ","P", $myfile1));  
  $myfile = str_replace("\n ", "", $myfile);  
  $myfile = str_replace("\n ", "", $myfile);  
  $myfile = str_replace("&", " and ", $myfile);  
  $mylines = split("\n", $myfile);  
Jetzt gehts. Danke! Selten so schnell in einem Forum einen Erfolg erzielt. Danke!!!!

Liebe Grüße

Homer
Mitglied: NetworkingHomer
NetworkingHomer 03.09.2013 um 13:32:31 Uhr
Goto Top
Okay, ein Wehrmutstropfen: Der User muss nach dem Doppelpunkt auch ein Leerzeichen eigeben. Das ist natürlich nicht so gut.
Mitglied: colinardo
colinardo 03.09.2013, aktualisiert am 04.09.2013 um 11:16:05 Uhr
Goto Top
Okay, ein Wehrmutstropfen: Der User muss nach dem Doppelpunkt auch ein Leerzeichen eigeben. Das ist natürlich nicht so gut.
Du könntest wie ich oben schon geschrieben habe das iCal-File vorher "impfen" und den Doppelpunkt nur an den jeweiligen Stellen ersetzen (in diesem Fall durch ein Leerzeichen):

back-to-topBeispiel:
$path_ical = 'test.ical';  
$content = file_get_contents($path_ical);
$lines = preg_split('/END:/',$content);  
$newLineArray = preg_replace('/SUMMARY:([^\n]*)(:)([^\n]*)/s','SUMMARY:$1 $3',$lines);  

for ($i = 0; $i < count($newLineArray); $i++){
	$newContent .= $newLineArray[$i] . " END:";	  
}
file_put_contents($path_ical,$newContent);

Grüße Uwe
Mitglied: NetworkingHomer
NetworkingHomer 04.09.2013 aktualisiert um 21:46:16 Uhr
Goto Top
Moin Uwe,

habe versucht, deinen Teil einzubauen, aber er zeigt keine Wirkung. Hab ich das richtig gemacht?
function ical2xml($URL) {


$path_ical = 'test.ical';  
$content = file_get_contents($URL);
$lines = preg_split('/END:/',$content);  
$newLineArray = preg_replace('/SUMMARY:([^\n]*)(:)([^\n]*)/s','SUMMARY:$1 $3',$lines);  

for ($i = 0; $i < count($newLineArray); $i++){
        $newContent .= $newLineArray[$i] . " END:";  
}
file_put_contents($path_ical,$newContent);

$myfile .= $newContent;

var_dump($myfile);

  $myfile = str_replace("\n ", "", $myfile);  
  $myfile = str_replace("&", " and ", $myfile);  
  $mylines = split("\n", $myfile);  

Viele Grüße

Homer
Mitglied: NetworkingHomer
NetworkingHomer 05.09.2013 um 06:30:01 Uhr
Goto Top
Ah, ich glaube, ich muss nich nach
SUMMARY
sondern nach
DESCRIPTION
suchen. Probiere ich nachher mal aus.
Mitglied: colinardo
colinardo 05.09.2013 aktualisiert um 10:15:06 Uhr
Goto Top
Hallo Homer,
so sollte es eigentlich funktionieren(bei mir erfolgreich getestet), kommt aber drauf an wie du es weiterverarbeitest. Die Funktion liefert den originalen Inhalt des ical-Files reduziert um die Doppelpunkte im SUMMARY-Field zurück
function cleanICAL($URL) {
  $content = file_get_contents($URL);
  $content = preg_replace('/\n/', "", $content);  
  $lines = preg_split('/END:/',$content);  
  $newLineArray = preg_replace('/SUMMARY:([^\n]*)(:)([^\n]*)/s','SUMMARY:$1 $3',$lines);  
  $newLineArray = preg_replace('/DESCRIPTION:([^\n]*)(:)([^\n]*)SUMMARY:/s','DESCRIPTION:$1 $3SUMMARY:',$newLineArray);  

  for ($i = 0; $i < count($newLineArray); $i++){
          $newContent .= $newLineArray[$i] . " END:";  
  }
  var_dump($newContent);
  return $newContent;
}
also machst du dann den Aufruf wie folgt:
$newICALContent = cleanICAL("http://www.ichbineineurl.de/test.ical");  
danach gibst du die Variable $newICALContent an die eigentliche Funktion die daraus ein XML-File macht. Oder du schreibst wie ich es im vorigen Thread angegeben habe das ICAL-File ins FileSystem und übergibst diesen Pfad an die eigentliche XML-Funktion.

Ah, ich glaube, ich muss nich nach SUMMARY sondern nach DESCRIPTION
SUMMARY ist der Betreff des Termins
DESCRIPTION sind zusätzliche Beschreibungen des Termins

-edit- habe das oben zusätzlich noch in die Funktion eingebaut.

Aber man sollte wirklich mal drüber nachdenken die eigentliche Funktion die das ical in ein XML einliest so umzuschreiben das nicht nur nach Doppelpunkten getrennt wird sondern das ganze mit Regular Expressions macht. Das ist wesentlich zuverlässiger !! Werde mir das beizeiten mal anschauen, im Moment ist zu wenig Zeit...

back-to-topp.s. Nehm diese Funktion hier, die macht genau das was du willst wesentlich zuverlässiger: http://evertpot.com/248/

Grüße Uwe
Mitglied: NetworkingHomer
NetworkingHomer 05.09.2013 um 21:28:20 Uhr
Goto Top
Moin Uwe!
Ich bin beeindruckt!

Mein derzeitiger Stand ist dieser (bevor ich dein letztes Posting las):

function ical2xml($URL) {

  $myfile = file_get_contents($URL);

$myfile = str_replace("DESCRIPTION:", "DESCRIPTION::", $myfile);  
$myfile = str_replace("BEGIN:", "BEGIN::", $myfile);  
$myfile = str_replace("SUMMARY:", "SUMMARY::", $myfile);  
$myfile = str_replace("LAST-MODIFIED::", "LAST-MODIFIED:", $myfile);  
$myfile = str_replace("DATE:", "DATE::", $myfile);  
$myfile = str_replace("PRODID:", "PRODID::", $myfile);  
$myfile = str_replace("UID:", "UID::", $myfile);  
$myfile = str_replace("END:", "END::", $myfile);  
$myfile = str_replace("LOCATION:", "LOCATION::", $myfile);  
$myfile = str_replace("Europe/Berlin:", "Europe/Berlin::", $myfile);  
$myfile = str_replace("RRULE:", "RRULE::", $myfile);  
$myfile = str_replace("URI:", "URI::", $myfile);  

 $myfile = str_replace("\n ", "", $myfile);  
  $myfile = str_replace("&", " and ", $myfile);  
  $mylines = split("\n", $myfile);  

  $xml = "";  
  foreach($mylines as $line) {
    if($line == "")  
      continue;

    list($key,$val) = split("::", $line);  
    $key = trim($key, "\r\n");  
    $val = trim($val, "\r\n");  
    $val = str_replace("\n", "", $val);  
    $val = str_replace("\r", "", $val);  

Dein Link zu dem anderen Script sieht extrem interessant aus.
Jetzt muss ich da erstmal ne Nacht drüber schlafen.

Vielen Dank und bis demnächst!

Viele Grüße

Homer