&/" aus MySQL-Datenbank korrekt umwandeln und in Meta Tags ausgeben?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • &/" aus MySQL-Datenbank korrekt umwandeln und in Meta Tags ausgeben?

    Hi.

    Ich hab ein (von mir dilettantisch modifiziertes) Script, das in Teilen ursprünglich für phpBB3 konzepiert wurde, zur Ausgabe von dynamischen Meta Tags für mein phpBB2 laufen. Leider wandelt es die in den Tabellen gespeicherten HTML-Zeichen wie &amp.; und &quot.; nicht um, d.h. mitunter werden in der viewforum.php solche:
    Code:
    <meta name="description" lang="de" content="Questions &amp.; Answers" /><meta name="keywords"    content="Questions,amp,Answers" />
    und in der viewtopic.php derartige Meta Tags ausgegeben:
    Code:
    <meta name="description" lang="de" content=" Nun hat es auch Johnny &amp.;quot;the Man in Black&amp.;quot; Cash erwischt">
    statt
    Code:
    <meta name="description" lang="de" content=" Nun hat es auch Johnny "the Man in Black" Cash erwischt">
    bzw.
    Code:
    <meta name="description" lang="de" content=" Nun hat es auch Johnny the Man in Black Cash erwischt">
    Die relevanten Teile des Scripts:
    Code:
    	function make_keywords($text) {
    		global $phpbb_root_path;
    		static $stop_words = array();
    		$keywords = '';
    		$num = 0;
    		$text = strtolower(preg_replace(array('`&(amp;)?#?[a-z0-9]+;`i', '`[[:punct:]]+`', '`[0-9]+`',  '`[\s]+`'), ' ', strip_tags($text)));
    		$text = explode(' ', trim($text), 50);
    		include($phpbb_root_path . 'language/lang_german/search_stopwords.php');
    		$stop_words = & $words;
    		$text = array_diff($text, $stop_words);
    		// We take the most used words first
    		$text = array_count_values($text);
    		arsort($text);
    		foreach ($text as $word => $count) {
    			if ( strlen($word) >= 3 ) {
    				$keywords .= ', ' . $word;
    				$num++;
    				if ( $num >= 15 ) {	
    					break;
    				}
    			}	
    		}
    		return trim($keywords, ', ');
    	}
    
    	function meta_filter_txt($text, $bbcode = true) {
    		if ($bbcode) {
    			static $RegEx = array();
    			static $replace = array(' ', ' ', '', ' ');
    			if (empty($RegEx)) {
    				$RegEx = array('`<[^>]*>(.*<[^>]*>)?`Usi', // HTML code
    					'`\[(' . 'img|url|flash|code' . ')[^\[\]]+\].*\[/\1[^\[\]]+\]`Usi', // bbcode to strip
    					'`\[/?[^\[\]]+\]`mi', // Strip all bbcode tags
    					'`[\s]+`' // Multiple spaces
    				);
    			}
    			return $this->word_limit(htmlspecialchars(preg_replace($RegEx, $replace, $text), ENT_COMPAT));
    		}
    		return $this->word_limit(htmlspecialchars(preg_replace(array('`<[^>]*>(.*<[^>]*>)?`Usi', '`[\s]+`'), ' ', $text), ENT_COMPAT));
    	}
    
    	function word_limit($string) {
    		return count($words = preg_split('/\s+/', ltrim($string), 25 + 1)) > 25 ? rtrim(substr($string, 0, strlen($string) - strlen(end($words)))) . '...' : $string;
    	}
    In der Viewtopic.php hab ich das hier stehen:
    Code:
    $phpbb_seo->seo_meta['meta_desc'] = $phpbb_seo->meta_filter_txt($postrow[0]['post_text']);
    $m_kewrd = '';
    $sql = "SELECT w.word_text
    		FROM " . TOPICS_TABLE . " t, " . SEARCH_MATCH_TABLE . " m, " . SEARCH_WORD_TABLE . " w
    		WHERE t.topic_id = $topic_id
    			AND t.topic_first_post_id = m.post_id
    			AND m.word_id = w.word_id LIMIT 15
    			ORDER BY w.word_count DESC";
    if( ($result = $db->sql_query($sql)) ) {
    
    	while ( $meta_row = $db->sql_fetchrow($result) ) {
    		$m_kewrd .= " " . $meta_row['word_text'];
    	}
    }
    $phpbb_seo->seo_meta['keywords'] = $phpbb_seo->make_keywords("$m_kewrd " . $phpbb_seo->seo_meta['meta_desc']);
    Wäre nett, wenn mir jemand helfen könnte!

    [e] Musste einen Punkt nach "amp" setzen.
    Zuletzt geändert von baerenwurm; 03.03.2009, 18:14.

  • #2
    Hier läuft doch alles richtig. Zumindest die Double Quotes sollten als Entitäten erhalten bleiben. Ansonsten wird invalider HTML Code erzeugt.

    Ebenso macht das Ampersand &amp ; keine Probleme in den Meta Angaben und wird ohne Umstände erkannt. Es ist sogar richtiger das Ampersand als Entität zu benutzen. Zumindest wird somit die Validität des HTML Quellcodes bewahrt.

    Fazit: Vollkommener Unsinn die Entitäten zurückzuwandeln.
    MM Newmedia | MeinBlog

    Kommentar


    • #3
      Ok, wusste nicht, dass die Bots das alles richtig "übersetzen". Wobei die double quotes doch offenbar falsch ausgelesen werden!?

      Sollte es nicht anstatt so:

      Code:
      <meta name="description" lang="de" content=" Nun hat es auch Johnny &amp.;quot;the Man in Black&amp.;quot; Cash erwischt">
      so aussehen?
      Code:
      <meta name="description" lang="de" content=" Nun hat es auch Johnny &quot.;the Man in Black&quot.; Cash erwischt">

      Kommentar


      • #4
        Na dann lass doch mal testweise die htmlspecialchars() Funktion bei der Ausgabe weg. Wenn die Entitäten so oder so schon in der Datenban sind, werden die doppelt umgewandelt.

        Probier das mal:
        PHP-Code:
        function meta_filter_txt($text$bbcode true) {
                if (
        $bbcode) {
                    static 
        $RegEx = array();
                    static 
        $replace = array(' '' '''' ');
                    if (empty(
        $RegEx)) {
                        
        $RegEx = array('`<[^>]*>(.*<[^>]*>)?`Usi'// HTML code
                            
        '`\[(' 'img|url|flash|code' ')[^\[\]]+\].*\[/\1[^\[\]]+\]`Usi'// bbcode to strip
                            
        '`\[/?[^\[\]]+\]`mi'// Strip all bbcode tags
                            
        '`[\s]+`' // Multiple spaces
                        
        );
                    }
                    return 
        $this->word_limit(htmlspecialchars(preg_replace($RegEx$replace$text), ENT_COMPAT'ISO-8859-1'false));
                }
                return 
        $this->word_limit(htmlspecialchars(preg_replace(array('`<[^>]*>(.*<[^>]*>)?`Usi''`[\s]+`'), ' '$text), ENT_COMPAT'ISO-8859-1'false));
            } 
        Funktioniert aber nur ab php5.2.3. Solltest Du eine ältere PHP Version nutzen, lass die htmlspecialchars() Funktion einfach weg.
        MM Newmedia | MeinBlog

        Kommentar

        Lädt...
        X