ilch Forum » Allgemein » HTML, PHP, SQL,... » BBCode Problem - ein Umlaut ist text weg

Geschlossen
  1. #1
    User Pic
    Ahrtas Moderator
    Registriert seit
    17.12.2007
    Beiträge
    2.368
    Beitragswertungen
    210 Beitragspunkte
    Also ich Schreib nen Text in die DB lies ihn aus mit
    $var = bbcode($db->txt);
    und er wird nicht angezeigt wenn der Text mindestens ein Umlaut besitzt.

    Bei einem Text komplett ohne Umlaute (z.B. Lorem ipsum) funktioniert es einwandfrei.

    bbcode
    <?php 
    #   Copyright by Manuel
    #   Support www.ilch.de
    
    
    defined ('main') or die ( 'no direct access' );
    function BBcode($s,$maxLength=40) {
      #$s = unescape($s);
    	
      $coTime = str_replace(' ', '', microtime());
    	preg_match_all('/\[code\](.+)\[\/code\]/Uis',$s,$result);
      
      $s = bbcode_code_start ($s, $coTime, $result);
      
      # bbcode einheitlicher machen zum bessern pruefen.
      $s = bbcode_simple_prev ($s);
      
      #$s = preg_replace ("/(\015\012|\015|\012)/", " \\1", $s);
      
      # autoumbruch nach x zeichen
      #$s = bbcode_autonewline($s, $coTime, $maxLength);
      
      $s = htmlentities($s);
      
      # speziell bilder
      $s = bbcode_images ($s);
      
      # speziell zitate ersetzten.
      $s = bbcode_quote ($s);
      
      # replace simple
    	$s = bbcode_simple ($s);
      
    	# smilies umwandeln
    	$s = bbcode_smiles ($s);
    	
      $s = preg_replace ("/\015\012|\015|\012/", "\n<br />", $s);
      
      # code zurueck ersetzten
      $s = bbcode_code_end ($s, $coTime, $result);
    	
    	return ($s);
    }
    
    # diese funktion ist etwas komplizierter. und zwar wird hier versucht
    # dem problem beizukommen das immer irgendwelche spassvoegel sehr lange
    # texte schreiben die dann das design verzerren. dagegen hilft nur der
    # automatische umbruch. ich habe mir dafuer ausgedacht es gibt
    # bestimmte zeichen ab dennen die kontrolle total aus ist (url, img)
    # und es gibt zeichen ab dennen die kontrolle wieder eingeschaltet wird
    # ausserdem gibt es zeichen ab dennen wieder von vorn angefangen wird
    # zu zahlen, wird der counter erreicht wird ein leerzeichen eingefueght.
    function bbcode_autonewline ($s, $coTime,$maxLength) {
      $neu_s = '';
      
      $ar_start = array (
        '[url=http://',
        '[img]'
      );
      
      $ar_ende = array (
        ']',
        '[/img]'
      );
      
      $ar_neu = array (
        ' ',
      );
      
      $ar_next = array (' ',"\n","\r",'[/url]','[/inurl]','[b]','[/b]','[i]','[/i]','[u]','[/u]',$coTime,'[list]','[/list]','[*]');
      
      $count   = TRUE;
      $countgr = null;
      $counter = -1;
      
      $a = strlen ($s);
      for ($i=0;$i<$a;$i++) {
        # counter raus / rein
        if ($count == TRUE) {
          foreach ($ar_start as $sk => $sv) {
            if ($s{$i} == substr($sv, 0, 1) AND preg_match("/^".preg_quote($sv, '/')."/", substr($s, $i))) {
              $count   = FALSE;
              $countgr = $sk;
              $counter = 0;
              #echo '<h1>ON</h1>';
              break;
            }
          }
        } elseif ($count == FALSE AND $s{$i} == substr($ar_ende[$countgr], 0, 1) AND preg_match("/^".preg_quote($ar_ende[$countgr], '/')."/", substr($s, $i))) {
          #echo '<h1>||'. $s{$i} .'||<br>||'.substr($s, $i, 10).'||<br>';
          #echo 'OFF</h1>';
          $count   = TRUE;
          $counter = -2;
          $countgr = null;
        }
     
        if ($count == TRUE) {
          $counter++;
        
          # ar neu?
          foreach ($ar_neu as $v) {
            if ($count == TRUE AND $s{$i} == substr($v, 0, 1) AND preg_match ("/^".preg_quote($v)."/", substr($s, $i))) {
              $counter = -3;
              break;
            }
          }
          
          # springen
          foreach ($ar_next as $v) {
            if ($s{$i} == substr($v, 0, 1) AND preg_match("/^".preg_quote($v, '/')."/", substr($s, $i))) {
              $i = $i + strlen ($v) - 1;
              $springen = true;
              $valSprin = $v;
              break;
            }
          }
          if (isset($springen) AND $springen === true) {
            $neu_s .= $valSprin;
            $springen = false;
            $valSprin = null;
            continue;
          }
        
        
          if ($counter >= $maxLength) {
            $neu_s  .= ' ';
            $counter = 0;
          }
        }
        
        $neu_s .= $s{$i};
      }
      
      /*
      $s = str_replace('</a>', ' </a>', $s);
      $lines = explode(' ',$s);
      
    	$ntxt = '';
    	foreach ($lines as $v) {
    	  if ( strpos($v,$coTime) === FALSE AND strpos ($v, 'src="') === FALSE AND strpos ($v, 'href="') === FALSE AND strpos ($v, '</table>') === FALSE) {
    		  $ntxt .= chunk_split($v, $maxLength, ' ').' ';
        } else {
    		  $ntxt .= $v.' ';
    		}
    	}
    	$s = $ntxt;
      $s = str_replace(' </a>', '</a>', $s);
      */
      return($neu_s);
    }
    
    function bbcode_images ($s) {
      global $allgAr;
      
      preg_match_all('/\[img\](http|https):\/\/([^\ \?&=\#\"\n\r\t<>]+)\.(gif|jpeg|jpg|png)\[\/img\]/Ui',$s,$imgRs);
      
    	$max_breite = 0;
    	if (isset($allgAr['allg_bbcode_max_img_width'])) {
        $max_breite = $allgAr['allg_bbcode_max_img_width'];
    	}
      $endung = array (1 => 'gif', 2 => 'jpg', 3 => 'png');
      
      if ( isset ($imgRs[0][0]) ) {
        for($i=0;$i<count($imgRs[0]);$i++) {
      	  $imgstr = $imgRs[1][$i].'://'.$imgRs[2][$i].'.'.$imgRs[3][$i];
          $size   = @getimagesize($imgstr);
    			$breite = $neueBreite = $size[0];
          $hoehe  = $neueHoehe  = $size[1];
          $er     = '';
          if (isset($endung[$size[2]]) OR !is_array($size)) {
            $er = '<img style="border: none;" src="'.$imgstr.'" />';
            if ( $breite > $max_breite ) {
              $neueHoehe  = intval($hoehe*$max_breite/$breite);
              $neueBreite = $max_breite;
              $er = '<a href="'.$imgstr.'" target="_blank"><img height="'.$neueHoehe.'" width="'.$neueBreite.'" style="border: none;" src="'.$imgstr.'" /></a>';
            }
          } 
          $s = str_replace($imgRs[0][$i],$er,$s);
        }
      }
      return($s);
    }
    
    function bbcode_quote ($s) {
     	$tpl = new tpl ( 'zitatreplace.htm' );
    	$header1_quote = $tpl->get(0);
    	$header2_quote = $tpl->get(1);
    	$footer1_quote = $tpl->get(2);
    	unset($tpl);
      $i=0;
      while(strpos($s,"[/quote]")!==FALSE AND $i < 5 ) {
        $i++;
        $s = preg_replace("#\[quote\=([^\]]*)\](.*)\[\/quote\]#Uis",$header1_quote."geschrieben von \\1".$header2_quote."\\2".$footer1_quote, $s);
        $s = preg_replace("/\[quote\](.*)\[\/quote\]/Usi", $header1_quote.$header2_quote."\\1".$footer1_quote, $s );
      }
      return ($s);
    }
    
    function bbcode_simple_prev ($s) {
      $search = array (
        "/(^|[^=\]\>\"])http:\/\/(www\.)?([^\s\"\<\[]*)/i",
        "/\[url\]http:\/\/(www\.)?(.*?)\[\/url\]/si",
      );
      
    	$replace = array (
        "\\1[url]http://\\2\\3[/url]",
        "[url=http://\\1\\2]\\2[/url]",
    	);
    						
    	$s = preg_replace($search, $replace, $s);
      return ($s);
    }
    
    function bbcode_simple ($s) {
      $page = preg_quote(dirname(str_replace('www.','',$_SERVER["HTTP_HOST"]).$_SERVER["SCRIPT_NAME"]), '/');
      $search = array (
        "/\[b\](.*?)\[\/b\]/si",
        "/\[i\](.*?)\[\/i\]/si",
        "/\[u\](.*?)\[\/u\]/si",
        "/\[url=http:\/\/(www\.)?(".$page.")(.*?)](.*?)\[\/url\]/si",
        "/\[url=http:\/\/(www\.)?(.*?)\](.*?)\[\/url\]/si",
        "/\[inurl=(www\.)?(.*?)\](.*?)\[\/inurl\]/si",
        "/\[list(=1)?\](.+)\[\/list\]/Usie",
        "/(script|about|applet|activex|chrome):/is",
      );
      
    	$replace = array (
        "<b>\\1</b>",
        "<i>\\1</i>",
        "<u>\\1</u>",
        "<a href=\"http://\\1\\2\\3\">\\4</a>",
        "<a href=\"http://\\1\\2\" target=\"_blank\">\\3</a>",    
        "<a href=\"\\1\\2\">\\3</a>",    
        "bbcode_simple_list ('\\1', '\\2')",
        "\\1&#058;",
    	);
    						
    	$s = preg_replace($search, $replace, $s);
      return ($s);
    }
    
    function bbcode_simple_list ($w, $s) {
    #  $s = preg_replace("\015\012
      $s = preg_replace("/\[\*\]([^\[]+)/ies", "'<li>'.trim('\\1').'</li>'", trim($s));
      if ($w == '=1') {
        return ('<ol>'.trim($s).'</ol>');
      }
      
      return ('<ul>'.trim($s).'</ul>');
    }
    
    function bbcode_smiles ($s) {
      global $global_smiles_array;
      if (!isset($global_smiles_array)) {
        $global_smiles_array = array();
        $erg = db_query("SELECT ent, url, emo FROM `prefix_smilies`");
    	  while ($row = db_fetch_object($erg) ) {
    		  $global_smiles_array[$row->ent] = $row->emo.'#@#-_-_-#@#'.$row->url;
    	  }
      }
      foreach ($global_smiles_array as $k => $v) {
        list($emo, $url) = explode('#@#-_-_-#@#', $v);
        $s = str_replace($k,'<img src="include/images/smiles/'.$url.'" border="0" alt="'.$emo.'" title="'.$emo.'" />',$s);
      }
      return ($s);
    }
    
    function bbcode_code_start ($s, $coTime, $result) {
    	for ($i=0;$i<count($result[1]);$i++) 	{
    		if ($result[0][$i]) {
    		  $s = str_replace ($result[0][$i],'#'.$coTime.'#'.$i.'#'.$coTime.'#',$s);
    		}
    	}
      return ($s);
    }
    
    function bbcode_code_end ($s, $coTime, $result) {
    	$tpl = new tpl ( 'codereplace.htm' );
    	for ($i=0;$i<count($result[1]);$i++) {
    		if ($result[1][$i]) {
    			ob_start();
    			#$result[1][$i] = str_replace ('&lt;', '<', str_replace('&gt;', '>', $result[1][$i]));
          #$codereplace = highlight_string(trim($result[1][$i]), 1);
    			highlight_string(trim($result[1][$i]));
    			$codereplace = ob_get_contents();
    			ob_end_clean();
    			$newstring = $tpl->set_get ( 'CODEREPLACE', $codereplace, 0);
    			$s = str_replace('#'.$coTime.'#'.$i.'#'.$coTime.'#',$newstring,$s);
    		}
    	}
    	unset($tpl);
      return ($s);
    }
    ?>


    Ich habe bereits ein paar andere Themen zu bbcode mal durchgeschaut und da ging es auch über die Zeichenkodierung, allerdings in der DB selbst speziell in diesem Thema.
    Die allgemeine Einstellung meiner DB zu der ilch connected ist "latin1_swedish_ci" die MySQL Tabellen haben jeweils "latin1_german1_ci" ist das vielleicht das Problem? grumml


    Dieses Problem hatte ich generell noch nie. Nicht bei xampp und nicht online.

    Was muss ich tun damit der Text normal ausgelesen wird?
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    Rock@wulf Hall Of Fame
    Registriert seit
    03.06.2004
    Beiträge
    3.282
    Beitragswertungen
    239 Beitragspunkte
    Wenn du Php 5.x einsetzt muss das entsprechende Setting für php in die index.php.

    Außerdem sollte bei der DB verbindung angegeben werden das sie auf latin läuft seit 5.3 geht man da von utf8 aus
    Meine Postings repräsentieren meine Meinung wenn nicht anders gekennzeichnet.
    MFG Rock@wulf
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Ahrtas Moderator
    Registriert seit
    17.12.2007
    Beiträge
    2.368
    Beitragswertungen
    210 Beitragspunkte
    Ich habe in der index.php von dem nächsten (noch nicht fertigen) Update von 1.1 O reingeschaut aber nichts gefunden was mir weiterhilft.

    In der mysql.php weiß ich nicht an welcher Stelle ich folgende Anweisung aus dem oben verlinkten Thema einfügen muss.
    mysql_set_charset('latin1', CONN);


    Im Moment habe ich es ohne... bin in MySQL noch nicht wirklich so bewandert. traurig

    index.php
    <?php
    #   Copyright by: Manuel
    #   Support: www.ilch.de
    
    define ( 'main' , TRUE );
    
    //Konfiguration zur Anzeige von Fehlern
    //Auf http://www.php.net/manual/de/function.error-reporting.php sind die verfügbaren Modi aufgelistet
    
    //Seit php-5.3 ist eine Angabe der TimeZone Pflicht
    if (version_compare(phpversion(), '5.3') != -1) {
    	if (E_ALL > E_DEPRECATED) {
    		@error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);
    	} else {
    		@error_reporting(E_ALL ^ E_NOTICE);
    	}
    	date_default_timezone_set('Europe/Berlin');
    } else {
    	@error_reporting(E_ALL ^ E_NOTICE);
    }
    @ini_set('display_errors','On');
    
    session_name  ('sid');
    session_start ();
    
    require_once ('include/includes/config.php');
    require_once ('include/includes/loader.php');
    
    db_connect();
    $allgAr = getAllgAr ();
    $menu = new menu();
    user_identification();
    site_statistic();
    
    if (is_admin()) { 
      require_once ('include/contents/'.$menu->get_url());
    } 
    
    if ( $allgAr['wartung'] == 1) {
      require_once ('include/contents/wartung.php');
    } else {
      require_once ('include/contents/'.$menu->get_url());
    }
    
    db_close();
    if (false) { //debugging aktivieren
    	debug('anzahl sql querys: '.$count_query_xyzXYZ);
    	debug('',1,true);
    }
    ?>

    mysql.php
    <?php
    #   Copyright by Manuel
    #   Support www.ilch.de
    
    
    defined ('main') or die ( 'no direct access' );
    
    $count_query_xyzXYZ = 0;
    
    function db_connect () {
      if (defined('CONN')) {
        return;
      }
      define ( 'CONN', @mysql_pconnect(DBHOST, DBUSER, DBPASS));
      $db = @mysql_select_db(DBDATE, CONN);
    
      if (!CONN) {
        die('Verbindung nicht m&ouml;glich, bitte pr&uuml;fen Sie ihre mySQL Daten wie Passwort, Username und Host<br />');
      }
      if ( !$db ) {
        die ('Kann Datenbank "'.DBDATE.'" nicht benutzen : ' . mysql_error(CONN));
      }
    }
    
    function db_close () {
      mysql_close ( CONN );
    }
    
    function db_check_error (&$r, $q) {
      if (!$r AND mysql_errno(CONN) <> 0 AND function_exists('is_coadmin') AND is_coadmin()) {
      	// var_export (debug_backtrace(), true)
        echo('<font color="#FF0000">MySQL Error:</font><br>'.mysql_errno(CONN).' : '.mysql_error(CONN).'<br>in Query:<br>'.$q.'<pre>'.debug_bt().'</pre>');
      }
      return ($r);
    }
    
    function db_query ($q) {
    
      global $count_query_xyzXYZ;
      $count_query_xyzXYZ++;
    
      if (preg_match ("/^UPDATE `?prefix_\S+`?\s+SET/is", $q)) {
        $q = preg_replace("/^UPDATE `?prefix_(\S+?)`?([\s\.,]|$)/i","UPDATE `".DBPREF."\\1`\\2", $q);
      } elseif (preg_match ("/^INSERT INTO `?prefix_\S+`?\s+[a-z0-9\s,\)\(]*?VALUES/is", $q)) {
        $q = preg_replace("/^INSERT INTO `?prefix_(\S+?)`?([\s\.,]|$)/i", "INSERT INTO `".DBPREF."\\1`\\2", $q);
      } else {
        $q = preg_replace("/prefix_(\S+?)([\s\.,]|$)/", DBPREF."\\1\\2", $q);
      }
    
      return (db_check_error(@mysql_query($q, CONN), $q));
    }
    
    function db_result ($erg, $zeile=0, $spalte=0) {
      return (mysql_result ($erg,$zeile,$spalte));
    }
    
    function db_fetch_assoc ($erg) {
      return (mysql_fetch_assoc($erg));
    }
    
    function db_fetch_row ($erg) {
      return (mysql_fetch_row($erg));
    }
    
    function db_fetch_object ($erg) {
    
      return (mysql_fetch_object($erg));
    }
    
    function db_num_rows ($erg) {
      return (mysql_num_rows ($erg));
    }
    
    function db_last_id () {
    	return ( mysql_insert_id (CONN));
    }
    
    function db_count_query ( $query ) {
      return (db_result(db_query($query),0));
    }
    
    function db_list_tables ( $db ) {
      return (mysql_list_tables ($db, CONN));
    }
    
    function db_tablename ($db, $i) {
      return (mysql_tablename ($db, $i));
    }
    
    function db_check_erg ($erg) {
      if ($erg == false OR @db_num_rows($erg) == 0) {
        exit ('Es ist ein Fehler aufgetreten');
      }
    }
    
    function db_make_sites ($page ,$where ,$limit ,$link ,$table, $anzahl = NULL) {
    
      $hvmax = 4; // hinten und vorne links nach page
    	$maxpage = ''; if ( empty ($MPL) ) { $MPL = ''; }
    	if ( is_null ( $anzahl ) ) {
        $resultID = db_query ( "SELECT COUNT(*) FROM prefix_".$table." ".$where );
        $total    = db_result($resultID,0);
      } else {
        $total = $anzahl;
      }
      if ($limit < $total) {
    	  $maxpage = $total / $limit;
    	  if (is_double($maxpage)) {
    		  $maxpage = ceil($maxpage);
    		}
    		$ibegin = $page - $hvmax;
    		$iende  = $page + $hvmax ;
    
    	  $vgl1 = $iende + $ibegin;
    		$vgl2 = ($hvmax * 2) + 1;
    		if ( $vgl1 <= $vgl2 ) {
    		  $iende = $vgl2;
    		}
    		$vgl3 = $maxpage - ($vgl2 -1);
    		if ($vgl3 < $ibegin ) {
    		  $ibegin = $vgl3;
    		}
    
    		if ($ibegin < 1) {
    		  $ibegin = 1;
    		}
    		if ($iende > $maxpage) {
    		  $iende = $maxpage;
    		}
    		$vMPL = '';
    		if ($ibegin > 1) {
    		  $vMPL = '<a href="'.$link.'-p1">&laquo;</a> ';
    		}
    		$MPL = $vMPL.'[ ';
    		for($i=$ibegin; $i <= $iende; $i++) {
          if($i == $page) {
    				$MPL .= $i;
    			} else {
    			  $MPL .= '<a href="'.$link.'-p'.$i.'">'.$i.'</a>';
    			}
          if ($i != $iende) {
    			  $MPL .= ' | ';
    			}
    		}
    		$MPL .= ' ]';
    		if ($iende < $maxpage) {
    		  $MPL .= ' <a href="'.$link.'-p'.$maxpage.'">&raquo;</a>';
    		}
      }
    	return $MPL;
    
    }
    ?>
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Rock@wulf Hall Of Fame
    Registriert seit
    03.06.2004
    Beiträge
    3.282
    Beitragswertungen
    239 Beitragspunkte
    eh warum nimmst du nicht den code aus P ?
    Meine Postings repräsentieren meine Meinung wenn nicht anders gekennzeichnet.
    MFG Rock@wulf
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    Ahrtas Moderator
    Registriert seit
    17.12.2007
    Beiträge
    2.368
    Beitragswertungen
    210 Beitragspunkte
    Also ich habe die mysql.php und die index.php aus der P kopiert.

    Soweit funktioniert es.

    Nun ist aber die index.php überschrieben... in der "alten" war das Wartungssystem integriert was ich eigentlich beibehalten wollte. traurig

    Edit: habs übernommen - thema erledigt lächeln
    Manchmal steh ich auf dem Schlauch zunge aber Danke für die Hilfe.


    Zuletzt modifiziert von Ahrtas am 17.04.2013 - 14:55:31
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    Rock@wulf Hall Of Fame
    Registriert seit
    03.06.2004
    Beiträge
    3.282
    Beitragswertungen
    239 Beitragspunkte
    Na aber die vier zeilen code wirst du doch rüber kopieren können O.o
    Meine Postings repräsentieren meine Meinung wenn nicht anders gekennzeichnet.
    MFG Rock@wulf
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    Ahrtas Moderator
    Registriert seit
    17.12.2007
    Beiträge
    2.368
    Beitragswertungen
    210 Beitragspunkte
    Ja hab ich schon zunge

    Aber mit der charset-Einstellung stimmt etwas noch nicht.

    Und zwar wenn ich utf8 eintrage, zeigt es mir den bbcode an.
    Dafür werden aber bei dem restlichen Text der aus der DB kommt die Umlaute nicht richtig angezeigt.

    ( index.htm hat auch utf-8 )

    Wenn ich latin1 eintrage wird der restliche Text richtig angezeigt, aber alles was in der bbcode(); steht wird erst garnicht ausgegeben.


    Aus der Version P habe ich lediglich nur die mysql.php und die index.php kopiert.

    Muss ich noch etwas anderes aus P kopieren oder muss ich die charset-Einstellung in der DB noch ändern?
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    Rock@wulf Hall Of Fame
    Registriert seit
    03.06.2004
    Beiträge
    3.282
    Beitragswertungen
    239 Beitragspunkte
    das beste währe komplett p zu verwenden.

    bbcode liegt am htmlspecial chars hab ich hier schonmal ne lösung geschrieben gehabt
    Meine Postings repräsentieren meine Meinung wenn nicht anders gekennzeichnet.
    MFG Rock@wulf
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    Ahrtas Moderator
    Registriert seit
    17.12.2007
    Beiträge
    2.368
    Beitragswertungen
    210 Beitragspunkte
    Ok also ich habe "bbcode lösung", "bbcode htmlspecialchars", "bbcode Umlaute" und "bbcode htmlentities" gesucht und kein Thema von dir gefunden.

    Könnte man solche Themen festtackern oder alle derartigen "wichtigen" Themen in einem Thread verlinken und diesen dann als "festes Thema" machen damit es jeder und schnell findet??


    Kannst du mir bitte den Link zu deiner Lösung posten? grumml
    0 Mitglieder finden den Beitrag gut.
  10. #10
    User Pic
    Lord|Schirmer Administrator
    Registriert seit
    21.03.2007
    Beiträge
    7.680
    Beitragswertungen
    1217 Beitragspunkte
    rules :: doku :: faq :: linkus
    1 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten