[résolu] "Transformer les urls en liens dans tous les commentaires"

DeevadDeevad Member
janvier 2014 modifié dans Bogues
Bonjour, je viens d'essayer la modification conseillé dans le wiki ici :
http://wiki.pluxml.org/index.php?page=Transformer+les+urls+en+liens+dans+tous+les+commentaires

Cela n'a pas fonctionné.
Les commentaires , ne s'affichaient plus ; et la page retourne l'erreur :
Fatal error: Using $this when not in object context in /server/www/themes/theme/commentaires.php on line 39

J'ai donc annulé la modification et décidé de rapporter le bug ici ; car il m'était impossible de le corriger seul.

Merci d'avance !

Réponses

  • Remplace $this->plxMotor par $plxShow->plxMotor
  • Merci Je-evrard ; la situation avance , même si la mofication ne fonctionne toujours pas ;
    A présent plus de ce message d'erreur mais également plus de liens dans mes commentaires , ( liens remplacés par des codes comme : q8zts43 , 006097625X , non clickable )
    Avec cette modification, également plus aucunes balises ne survit , ni retour à la ligne.
  • Tu peux essayer la fonction de sebsauvage utilisée dans shaarli :
    <?php
    ob_start();
    $plxShow->comContent();
    $comContent = ob_get_clean();
    $comContent = preg_replace('!(((?:https?|ftp|file)://|apt:|magnet:)\S+[[:alnum:]]/?)!si','<a href="$1" rel="nofollow">$1</a>',$comContent);
    ?>
    

    J'ai pas testé mais ça devrait fonctionner.
  • Jerry WhamJerry Wham Member
    janvier 2014 modifié
    Sinon, une version complète issue des fonctions de FluxBB, testée avec la page commentaires du thème par défaut :
    <?php if(!defined('PLX_ROOT')) exit; 
    /**
    * @version $Id: trim.php,v 1.1 2006/02/25 13:50:17 harryf Exp $
    * @package utf8
    * @subpackage strings
    */
    
    /**
    * UTF-8 aware replacement for ltrim()
    * Note: you only need to use this if you are supplying the charlist
    * optional arg and it contains UTF-8 characters. Otherwise ltrim will
    * work normally on a UTF-8 string
    * @author Andreas Gohr <andi@splitbrain.org>
    * @see http://www.php.net/ltrim
    * @see http://dev.splitbrain.org/view/darcs/dokuwiki/inc/utf8.php
    * @return string
    * @package utf8
    * @subpackage strings
    */
    function utf8_ltrim( $str, $charlist=false)
    {
    	if($charlist === false)
    		return ltrim($str);
    
    	// Quote charlist for use in a characterclass
    	$charlist = preg_replace('!([\\\\\\-\\]\\[/^])!', '\\\${1}', $charlist);
    
    	return preg_replace('/^['.$charlist.']+/u', '', $str);
    }
    
    /**
    * UTF-8 aware replacement for rtrim()
    * Note: you only need to use this if you are supplying the charlist
    * optional arg and it contains UTF-8 characters. Otherwise rtrim will
    * work normally on a UTF-8 string
    * @author Andreas Gohr <andi@splitbrain.org>
    * @see http://www.php.net/rtrim
    * @see http://dev.splitbrain.org/view/darcs/dokuwiki/inc/utf8.php
    * @return string
    * @package utf8
    * @subpackage strings
    */
    function utf8_rtrim($str, $charlist=false)
    {
    	if($charlist === false)
    		return rtrim($str);
    
    	// Quote charlist for use in a characterclass
    	$charlist = preg_replace('!([\\\\\\-\\]\\[/^])!', '\\\${1}', $charlist);
    
    	return preg_replace('/['.$charlist.']+$/u', '', $str);
    }
    
    //---------------------------------------------------------------
    /**
    * UTF-8 aware replacement for trim()
    * Note: you only need to use this if you are supplying the charlist
    * optional arg and it contains UTF-8 characters. Otherwise trim will
    * work normally on a UTF-8 string
    * @author Andreas Gohr <andi@splitbrain.org>
    * @see http://www.php.net/trim
    * @see http://dev.splitbrain.org/view/darcs/dokuwiki/inc/utf8.php
    * @return string
    * @package utf8
    * @subpackage strings
    */
    function utf8_trim( $str, $charlist=false)
    {
    	if($charlist === false)
    		return trim($str);
    
    	return utf8_ltrim(utf8_rtrim($str, $charlist), $charlist);
    }
    
    /**
    * Wrapper round mb_strlen
    * Assumes you have mb_internal_encoding to UTF-8 already
    * Note: this function does not count bad bytes in the string - these
    * are simply ignored
    * @param string UTF-8 string
    * @return int number of UTF-8 characters in string
    * @package utf8
    * @subpackage strings
    */
    function utf8_strlen($str)
    {
    	return mb_strlen($str);
    }
    /**
    * Assumes mbstring internal encoding is set to UTF-8
    * Wrapper around mb_substr
    * Return part of a string given character offset (and optionally length)
    * @param string
    * @param integer number of UTF-8 characters offset (from left)
    * @param integer (optional) length in UTF-8 characters from offset
    * @return mixed string or FALSE if failure
    * @package utf8
    * @subpackage strings
    */
    function utf8_substr($str, $offset, $length = false)
    {
    	if ($length === false)
    		return mb_substr($str, $offset);
    	else
    		return mb_substr($str, $offset, $length);
    }
    //
    // Fetch the current protocol in use - http or https
    //
    function get_current_protocol()
    {
    	$protocol = 'http';
    
    	// Check if the server is claiming to using HTTPS
    	if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off')
    		$protocol = 'https';
    
    	// If we are behind a reverse proxy try to decide which protocol it is using
    	if (defined('FORUM_BEHIND_REVERSE_PROXY'))
    	{
    		// Check if we are behind a Microsoft based reverse proxy
    		if (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) != 'off')
    			$protocol = 'https';
    
    		// Check if we're behind a "proper" reverse proxy, and what protocol it's using
    		if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']))
    			$protocol = strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']);
    	}
    
    	return $protocol;
    }
    
    
    //
    // Fetch the base_url, optionally support HTTPS and HTTP
    //
    function get_base_url($support_https = false)
    {
    	global $pun_config;
    	static $base_url;
    
    	if (!$support_https)
    		return $pun_config['o_base_url'];
    
    	if (!isset($base_url))
    	{
    		// Make sure we are using the correct protocol
    		$base_url = str_replace(array('http://', 'https://'), get_current_protocol().'://', $pun_config['o_base_url']);
    	}
    
    	return $base_url;
    }
    //
    // A wrapper for utf8_trim for compatibility
    //
    function pun_trim($str, $charlist = false)
    {
    	return is_string($str) ? utf8_trim($str, $charlist) : '';
    }
    //
    // Calls htmlspecialchars with a few options already set
    //
    function pun_htmlspecialchars($str)
    {
    	return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
    }
    //
    // Calls htmlspecialchars_decode with a few options already set
    //
    function pun_htmlspecialchars_decode($str)
    {
    	if (function_exists('htmlspecialchars_decode'))
    		return htmlspecialchars_decode($str, ENT_QUOTES);
    
    	static $translations;
    	if (!isset($translations))
    	{
    		$translations = get_html_translation_table(HTML_SPECIALCHARS, ENT_QUOTES);
    		$translations['&#039;'] = '\''; // get_html_translation_table doesn't include &#039; which is what htmlspecialchars translates ' to, but apparently that is okay?! http://bugs.php.net/bug.php?id=25927
    		$translations = array_flip($translations);
    	}
    
    	return strtr($str, $translations);
    }
    //
    // Truncate URL if longer than 55 characters (add http:// or ftp:// if missing)
    //
    function handle_url_tag($url, $link = '', $bbcode = false)
    {
    	$url = pun_trim($url);
    	$title = '';
    
    	// Deal with [url][img]http://example.com/test.png[/img][/url]
    	if (preg_match('%<img src=\\\\"(.*?)\\\\"%', $url, $matches))
    		return handle_url_tag($matches[1], $url, $bbcode);
    
    	$full_url = str_replace(array(' ', '\'', '`', '"'), array('%20', '', '', ''), $url);
    	if (strpos($url, 'www.') === 0) // If it starts with www, we add http://
    		$full_url = 'http://'.$full_url;
    	else if (strpos($url, 'ftp.') === 0) // Else if it starts with ftp, we add ftp://
    		$full_url = 'ftp://'.$full_url;
    	else if (strpos($url, '/') === 0) // Allow for relative URLs that start with a slash
    		$full_url = get_base_url(true).$full_url;
    	else if (!preg_match('#^([a-z0-9]{3,6})://#', $url)) // Else if it doesn't start with abcdef://, we add http://
    		$full_url = 'http://'.$full_url;
    
    	// Ok, not very pretty :-)
    	if ($bbcode)
    	{
    		if ($full_url == $link)
    			return '[url]'.$link.'[/url]';
    		else
    			return '[url='.$full_url.']'.$link.'[/url]';
    	}
    	else
    	{
    		if ($link == '' || $link == $url)
    		{
    			$url = pun_htmlspecialchars_decode($url);
    			$link = utf8_strlen($url) > 55 ? utf8_substr($url, 0 , 39).' … '.utf8_substr($url, -10) : $url;
    			$link = pun_htmlspecialchars($link);
    			$title = ' title="'.$full_url.'"';
    		}
    		else
    			$link = stripslashes($link);
    
    		return '<a href="'.$full_url.'" rel="nofollow" onclick="window.open(this.href);return false;"'.$title.'>'.$link.'</a>';
    	}
    }
    //
    // Replace string matching regular expression
    //
    // This function takes care of possibly disabled unicode properties in PCRE builds
    //
    function ucp_preg_replace($pattern, $replace, $subject, $callback = false)
    {
    	if($callback) 
    		$replaced = preg_replace_callback($pattern, create_function('$matches', 'return '.$replace.';'), $subject);
    	else
    		$replaced = preg_replace($pattern, $replace, $subject);
    
    	// If preg_replace() returns false, this probably means unicode support is not built-in, so we need to modify the pattern a little
    	if ($replaced === false)
    	{
    		if (is_array($pattern))
    		{
    			foreach ($pattern as $cur_key => $cur_pattern)
    				$pattern[$cur_key] = str_replace('\p{L}\p{N}', '\w', $cur_pattern);
    
    			$replaced = preg_replace($pattern, $replace, $subject);
    		}
    		else
    			$replaced = preg_replace(str_replace('\p{L}\p{N}', '\w', $pattern), $replace, $subject);
    	}
    
    	return $replaced;
    }
    
    //
    // A wrapper for ucp_preg_replace
    //
    function ucp_preg_replace_callback($pattern, $replace, $subject)
    {
    	return ucp_preg_replace($pattern, $replace, $subject, true);
    }
    
    //
    // Make hyperlinks clickable
    //
    function do_clickable($text)
    {
    	$text = ' '.$text;
    	$text = ucp_preg_replace_callback('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(https?|ftp|news){1}://([\p{L}\p{N}\-]+\.([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%ui', 'stripslashes($matches[1].$matches[2].$matches[3].$matches[4]).handle_url_tag($matches[5]."://".$matches[6], $matches[5]."://".$matches[6], false).stripslashes($matches[4].$matches[10].$matches[11].$matches[12])', $text);
    	$text = ucp_preg_replace_callback('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(www|ftp)\.(([\p{L}\p{N}\-]+\.)+[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%ui','stripslashes($matches[1].$matches[2].$matches[3].$matches[4]).handle_url_tag($matches[5].".".$matches[6], $matches[5].".".$matches[6], false).stripslashes($matches[4].$matches[10].$matches[11].$matches[12])', $text);
    
    	return substr($text, 1);
    }
    ?>
    
    	<?php if($plxShow->plxMotor->plxRecord_coms): ?>
    
    	<div id="comments">
    
    		<h2>
    			<?php echo $plxShow->artNbCom(); ?>
    		</h2>
    
    		<?php while($plxShow->plxMotor->plxRecord_coms->loop()): # On boucle sur les commentaires 
    
    		ob_start();
    		$plxShow->comContent();
    		$comContent = ob_get_clean();
    		?>
    
    		<div id="<?php $plxShow->comId(); ?>" class="comment">
    			<blockquote>
    				<p class="info_comment">
    					<a class="num-com" href="<?php $plxShow->ComUrl(); ?>" title="#<?php echo $plxShow->plxMotor->plxRecord_coms->i+1 ?>">#<?php echo $plxShow->plxMotor->plxRecord_coms->i+1 ?></a>
    					<time datetime="<?php $plxShow->comDate('#num_year(4)-#num_month-#num_day #hour:#minute'); ?>"><?php $plxShow->comDate('#day #num_day #month #num_year(4) &#64; #hour:#minute'); ?></time>
    					<?php $plxShow->comAuthor('link'); ?>
    					<?php $plxShow->lang('SAID'); ?> :
    				</p>
    				<p class="content_com type-<?php $plxShow->comType(); ?>"><?php echo do_clickable($comContent); ?></p>
    			</blockquote>
    		</div>
    
    		<?php endwhile; # Fin de la boucle sur les commentaires ?>
    
    		<div class="rss">
    			<?php $plxShow->comFeed('rss',$plxShow->artId()); ?>
    		</div>
    
    	</div>
    
    	<?php endif; ?>
    
    	<?php if($plxShow->plxMotor->plxRecord_arts->f('allow_com') AND $plxShow->plxMotor->aConf['allow_com']): ?>
    
    	<div id="form">
    
    		<h2>
    			<?php $plxShow->lang('WRITE_A_COMMENT') ?>
    		</h2>
    
    		<form action="<?php $plxShow->artUrl(); ?>#form" method="post">
    			<fieldset>
    				<p>
    					<label for="id_name"><?php $plxShow->lang('NAME') ?> :</label>
    					<input id="id_name" name="name" type="text" size="20" value="<?php $plxShow->comGet('name',''); ?>" maxlength="30" />
    				</p>
    				<p>
    					<label for="id_site"><?php $plxShow->lang('WEBSITE') ?> :</label>
    					<input id="id_site" name="site" type="text" size="20" value="<?php $plxShow->comGet('site',''); ?>" />
    				</p>
    				<p>
    					<label for="id_mail"><?php $plxShow->lang('EMAIL') ?> :</label>
    					<input id="id_mail" name="mail" type="text" size="20" value="<?php $plxShow->comGet('mail',''); ?>" />
    				</p>
    				<p>
    					<label for="id_content" class="lab_com"><?php $plxShow->lang('COMMENT') ?> :</label>
    					<textarea id="id_content" name="content" cols="35" rows="6"><?php $plxShow->comGet('content',''); ?></textarea>
    				</p>
    				<p class="com-alert">
    					<?php $plxShow->comMessage(); ?>
    				</p>
    				<?php if($plxShow->plxMotor->aConf['capcha']): ?>
    				<p>
    					<label for="id_rep"><?php echo $plxShow->lang('ANTISPAM_WARNING') ?></label>
    					<?php $plxShow->capchaQ(); ?> :
    					<input id="id_rep" name="rep" type="text" size="2" maxlength="1" />
    				</p>
    				<?php endif; ?>
    				<p>
    					<input type="submit" value="<?php $plxShow->lang('SEND') ?>" />
    				</p>
    			</fieldset>
    		</form>
    
    	</div>
    
    	<?php else: ?>
    
    		<p>
    			<?php $plxShow->lang('COMMENTS_CLOSED') ?>.
    		</p>
    
    	<?php endif; # Fin du if sur l'autorisation des commentaires ?>
    
    
  • Je viens d'en faire un petit plugin qu'il suffit juste d'activer. Pas d'appel de hook à faire...
  • Merci Jerry Wham !
    J'ai pu essayer le plugin; c'est très facile d'installation.
    Ca marche impeccablement bien , si ce n'est que j'ai avant l'affichage de ma page un bon paquets de 'notice:' et un 'warning:' qui apparait
    log : http://www.pasteall.org/48715/text Sinon, tous les liens s'affichent. ( je teste en local )

    Comment se débarasser des notices et warnings ? Aussi , je suis toujours en 5.2 .
  • Quel est le contenu de tes commentaires s'il te plait ?

    Peux-tu me faire un fichier texte et me l'envoyer par mail pour ne pas polluer le topic ?

    En attendant ligne 279 du fichier functions.php, tu peux mettre le dernier paramètre de la fonction à false.
    return ucp_preg_replace($pattern, $replace, $subject, false);
    
    mais ce n'est que provisoire.
  • Merci Jerry, c'est sympa d'aider à débugger mon cas.
    D'avoir rajouté 'false' à la l.279 ; ça a transformé tous mes liens en expressions du genre :
    stripslashes($matches[1].$matches[2].$matches[3].$matches[4]).handle_url_tag($matches[5]."://".$matches[6], $matches[5]."://".$matches[6], false).stripslashes($matches[4].$matches[10].$matches[11].$matches[12])
    

    Sinon, pour l'exemple de liens, je teste ( en copie local ) cet article ou j'ai pas mal de liens, long , raccourcis, etc... :
    http://www.davidrevoy.com/article195/top-5-art-guide-from-my-bookshelf
  • Jerry WhamJerry Wham Member
    janvier 2014 modifié
    Bon je viens de tester tous les commentaires en les recopiant et je ne reproduis par l'erreur.
    Quelle est ta configuration : version php, phpinfo()...?

    PS : remet à true.

    Peux-tu voir si ça bugue avec un seul commentaire (crée un article bidon que tu commentes avec le premier commentaire contenant un lien) ?
    Si le bug n'est pas reproduit, peux-tu ajouter le suivant et ainsi de suite pour voir si on peut trouver le lien qui fait buguer ?
  • Merci Jerry,
    Ce doit être en rapport avec ma version local. Je n'ai pas encore essayer un test en 'live' sur mon espace mutualisé chez OVH ; en local je tourne sous Xamp ( sans post install , ni config, vanilla ) sur Arch Linux. PHP Version 5.5.6

    Pour reproduire le bug que j'ai ; j'ai pu le faire avec un premier lien Amazon :
    http://i.imgur.com/u9FXy9r.png

    Merci si tu as des pistes. Peut-être que les notices/warning sont trop peu tolérant sur l'installation par défaut...
  • Je vais retester avec ce lien voir si je peux trouver quelque chose.
    Pour ce qui est de la tolérance, mon serveur de test m'affiche toutes les erreurs s'il y a en a. Est-ce que tu peux me montrer ce qu'affiche le phpinfo() ? Peut-être est-ce dû à une extension qui n'est pas activée (mb_string)?
  • Merci pour ta perséverance Jerry ; j'ai envoyé le lien vers mon phpinfo avec la fonction E-mail du forum, afin de garder certaines données sensibles hors publique.
  • Bon, je viens de regarder et la seule différence notable est la version de php utilisée. Tu utilises une version légèrement plus récente que la mienne en local et que celle de mon hébergeur.
    Je vais essayer d'upgrader en local pour voir si les erreurs surviennent. Peut-être que ça vient de là mais je dis ça sans conviction aucune. :/
  • Je confirme Jerry. J'ai lancé mon dernier site sur le server d'OVH et activé le plugin pour voir : pas de warning ni de notice sur le même set de liens.
    http://www.davidrevoy.com/article/195/article-books-i-recommend-for-learning-to-draw-and-paint.html#c1386455374-1
    Merci , ça marche nickel.

    Maintenant, je suis curieux de savoir comment marcherai la detection de liens finissant par *.jpg ou *.png ou *.jpeg ...etc...pour les afficher dans les commentaires :)
    En attendant que je devienne plus compétent en regex pour 'matcher' ça ; je mets le sujet en 'résolu' ; merci Jerry !
  • Jerry WhamJerry Wham Member
    janvier 2014 modifié
    Ça marche mais on ne sait pas pourquoi, et ça c'est pas cool. :(
    Je ne pense pas que cela vienne de la version de php car les erreurs que tu as levées concernaient des index non trouvés par la regex. Bizarre comme c'est étrange... :/

    Ensuite, ta deuxième question était d'afficher une image si on rencontre un mot finissant par jpg ou png, c'est ça ?

    PS : Nickel ton nouveau site. Par contre, tu as des erreurs dans le code de ta page professionnelle : il manque la balise span de fermeture pour le subheader dans le header de la sidebar et tu englobes des div dans un lien, laquelle div reprend le lien en question (tu suis ?). Ça donne un truc du style :
    <a href="url"><div>Texte <a href="url">texte</a></div></a>
    
    <a href="http://www.davidrevoy.com/article/189/concept-art-vehicle-kuhn-industry.html" alt="Concept-art: vehicle, Kuhn industry" title="Concept-art: vehicle, Kuhn industry, click to read description or comment">
            <img src="http://www.davidrevoy.com/data/images/blog/2013/10/proj-car.jpg" alt="artwork by David Revoy" />        
            <div class="title">
                  <a href="http://www.davidrevoy.com/article/189/concept-art-vehicle-kuhn-industry.html" title="Concept-art: vehicle, Kuhn industry">Concept-art: vehicle, Kuhn industry</a>
            </div>
            <div class="subtitle">
            09 october 2013 ~ <a href="http://www.davidrevoy.com/article/189/concept-art-vehicle-kuhn-industry.html#comments" title="5 comments">5 comments</a><br/>
            </div>
    </a>
    
    
    Je pense que tu peux supprimer le lien qui englobe tout le bloc.
  • Super merci pour le site, et aussi pour ton coup d'oeil dans mon code et l'aide. J'ai rebricoler ça, et c'est moins 'rouge' sous Firefox en mode Ctrl+U 8o
  • You're welcome ;)
Connectez-vous ou Inscrivez-vous pour répondre.