Uwe: Stringfunktionen - Geschwindigkeit

Hallo Allerseits,
ich habe ein ziemlich großes Problem.
Für ein CMS habe ich bbcodes eingesetzt also [b] und [img] usw. Diese stehen in einer MySQL-Datenbank. Jetzt habe ich eine Funktion geschrieben, die das ganze wieder rücktransformiert. Nur leider dauert das unzumutbar lange (3-4 sek und mehr). Ich hab schon alles mögliche probiert aber ich komme irgendwie nicht zu einer optimierten Lösung.

Vielen Dank Eure Hilfe!

Hier hab ich mal meine Funktion txt_convert() mit angehängt:

function txt_convert($text) {
global $id,$lang,$session_link,$action,$show;

$words = explode(" ",$text);
  $count_words = count($words)-1;
  if($count_words >= 0)
  {
   for($i=0;$i<=$count_words;$i++)
    {
     $website_found=false;
     $email_found=false;
     $img_found=false;
     if(strpos($words[$i], 'http://')===0) //Links umwandeln
      {
       if($words[$i]!="")
       {
        $short_link=substr($words[$i],0,$length);
        $words[$i]='<a href="'.$words[$i].'" target="_blank">'.$short_link.'</a>';
        $website_found=true;
       }

}
     if(ereg("^.+@.+\..+$", $words[$i]) ) //email-adressen umwandeln
      {
       $previous_at=substr($words[$i],0,strpos($words[$i],"@"));
       $after_at=substr($words[$i],strpos($words[$i],"@")+1,strlen($words[$i]));
       $words[$i]='<a href="../mail/mail.php?id='.$id.'&lang='.$lang.'&action=gbmessagemail&prev='.$previous_at.'&after='.$after_at.'&entry_number='.$entry_number.$session_link.'">'.$previous_at.'<img src="../images/buttons/st.gif" border="0">'.$after_at.'</a>';
       $email_found=true;
      }

if (strpos($words[$i], '[img]')>=0)
      {
       $words[$i] = ereg_replace('[\img]', ' <img src="', $words[$i]);
       $words[$i] = ereg_replace('[/img]', '"> ', $words[$i]);
       $img_found=true;
      }

if (strpos($words[$i], '[uimg=')>=0)
      {

$temp=substr($words[$i],strpos($words[$i], '[uimg=')+6,strlen($words[$i]));

$img_number=substr($temp,0, strpos($temp, ']'));

if ($img_number%2==0) $class_number="1";
    else $class_number=$class_number="2";

$abfrage = "SELECT * FROM img WHERE ID=$img_number LIMIT 1";
       $result= mysql_query($abfrage);
    $row = @mysql_fetch_assoc($result);

$thumbnail='http://localhost/ffw/website/images/public/thumb_'.$row['img_url'];
    $img_name=$row['img_name'];
   // $show_img='<a href="showimg.php" title="'.$row['img_name'].'" class="img_art'.$class_number.'"><img src="'.$thumbnail.'" border="0"></a>';

$show_img="<table class="img_art$class_number"><tr><td bgcolor="#cccccc"><a href="javascript:NeuesFenster('http://localhost/ffw/website/content/showimg.php?id=$id&lang=$lang&img_number=$img_number',600,500)" name="Bild anzeigen" onMouseOver="window.status='Bild anzeigen'; return true;" onMouseOut="window.status=''; return true;" target="_top" title="$img_name"><img src="$thumbnail" border="0"><br><img src="http://localhost/ffw/website/images/buttons/lupe.gif" border="0"></a><font class="small">$img_name</font></td></tr></table>";

if ($action=="start" || $show=="imgcat") $show_img="";
    $words[$i] = ereg_replace('[\uimg='.$img_number.']', $show_img, $words[$i]);

}

///Absätze hinzufügen

if (strpos($words[$i], '[absatz]')>=0)
      {

$words[$i] = ereg_replace('[\absatz]', '</p><p align="justify">', $words[$i]);
       }

//LINKSBÜNDIG
   if (strpos($words[$i], '[left]')>=0)
         {

$words[$i] = ereg_replace('[\left]', '<div align="left">', $words[$i]);

}

if (strpos($words[$i], '[/left]')>=0)
         {

$words[$i] = ereg_replace('[/left]', '</div>', $words[$i]);

}

//rechtsbündig
   if (strpos($words[$i], '[right]')>=0)
         {

$words[$i] = ereg_replace('[\right]', '<div align="right">', $words[$i]);

}

if (strpos($words[$i], '[/right]')>=0)
         {

$words[$i] = ereg_replace('[/right]', '</div>', $words[$i]);

}

//zentriert
   if (strpos($words[$i], '[center]')>=0)
         {

$words[$i] = ereg_replace('[\center]', '<div align="center">', $words[$i]);

}

if (strpos($words[$i], '[/center]')>=0)
         {

$words[$i] = ereg_replace('[/center]', '</div>', $words[$i]);

}

//fett
   if (strpos($words[$i], '[b]')>=0)
         {

$words[$i] = ereg_replace('[\b]', '<b>', $words[$i]);

}

if (strpos($words[$i], '[/b]')>=0)
         {

$words[$i] = ereg_replace('[/b]', '</b>', $words[$i]);

}

//kursiv
   if (strpos($words[$i], '[k]')>=0)
         {

$words[$i] = ereg_replace('[\k]', '<i>', $words[$i]);

}

if (strpos($words[$i], '[/k]')>=0)
         {

$words[$i] = ereg_replace('[/k]', '</i>', $words[$i]);

}

// Ende Absätze

//LINKS
    if (strpos($words[$i], '[url=')>=0)
      {
           $end_lenght=-(strpos($words[$i], '[/url]')-strpos($words[$i], ']'));

$start_url=strpos($words[$i], '[url=')+5;
     $url_lenght=strpos($words[$i], ']')-strpos($words[$i], '[url=')-5;

$link_url=substr($words[$i],$start_url,$url_lenght);

$words[$i] = ereg_replace('[\url='.$link_url.']', '<a href="'.$link_url.'" target="_blanket">', $words[$i]);
           //$words[$i] = ereg_replace('[/url=', '<a href="'.$link_url.'">LINK</a>', $words[$i]);
    }

if (strpos($words[$i], '[/url]')>=0)
  {

$words[$i] = ereg_replace('[/url]', '</a>', $words[$i]);

}

///ENDE LINKS

if (strlen($words[$i])>=$length && $email_found===false && $website_found===false)
      {
      #$words[$i] = chunk_split($words[$i], $length,"-<br>");
      #$length = strlen($words[$i])-5;
      #$words[$i] = substr($words[$i],0,$length);
      }
     $text = implode(" ",$words);
   } //Ende For-Schleife
  }
  else
   {
    $text = chunk_split($text,$length,"-<br>");
   }
return $text;
}

////Ich habe auch schon die ganzen ereg_replace()-Funktionen durch str_replace()-Funktionen ersetzt, ohne Ergebnis.

  1. Ich hab meinen Fehler gefunden.
    Hatte die implode()-Fkt. innerhalb der for-schleife ausgeführt.

    Vielen Dank all denen die es sich angesehen haben.

    lg Uwe