Soucis avec une fonction PHP

Fermé
misterclic66 Messages postés 12 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 22 avril 2011 - 24 févr. 2011 à 12:04
misterclic66 Messages postés 12 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 22 avril 2011 - 25 févr. 2011 à 08:37
Bonjour,

Je suis en train de créer une interface de rédaction d'articles pour mes utilisateurs, qui pourront insérer une revue de presse, soit en rédigeant leurs articles, soit en les copiant-collant, tout ça dans un FCK Editor.

Je voudrais que tous les liens soient à ouverture dans une nouvelle fenêtre et dois donc ajouter target="_blank" à chaque balise <a href....>

A cet effet, j'ai créé la fonction PHP suivante (vos améliorations sont les bienvenues) :

<?php
// une fonction qui rajoute target="_blank" à tous les liens qui ne l'ont pas ou ont une autre target"
function add_blank($html) {  
	$longueur_de_l_article = strlen($html);
	$curseur=0;
	while ($curseur <= ($longueur_de_l_article-3)) {
		if (substr($html, $curseur, 3)=='<a ') {//on a trouvé une balise <a
			$la_balise_lien = substr($html, $curseur);
			$la_balise_lien = str_replace (strstr($la_balise_lien, '>'), '>', $la_balise_lien); //ona isolé <a.....>
			if (ereg('href=',$la_balise_lien)) {
				if (!ereg('target=',$la_balise_lien)) {//aucune target
					$la_balise_modifiee = str_replace ('>', ' target="_blank">', $la_balise_lien);
				} else {//déjà une target, mais pas la bonne
					if ( (ereg('target="',$la_balise_lien)) && (!ereg('target="_blank"',$la_balise_lien)) ) {//c'est écrit avec des ""
						$cible = substr(strstr($la_balise_lien, 'target="'), 8);
						$cible = str_replace (strstr($la_balise_lien, '"'), '' , $cible, 1);
						$target = 'target="'.$cible.'"';
						$target_blank = 'target="_blank"';
					} elseif ( (ereg("target='",$la_balise_lien)) && (!ereg("target='_blank'",$la_balise_lien)) ) {//c'est écrit avec des ''
						$cible = substr(strstr($la_balise_lien, "target='"), 8);
						$cible = str_replace (strstr($la_balise_lien, "'"), "" , $cible, 1);
						$target = "target='".$cible."'";
						$target_blank = "target='_blank'";
					} elseif ( (ereg('target=',$la_balise_lien)) && (!ereg('target=_blank',$la_balise_lien)) ) {//c'est écrit sans "" ni ''
						$cible = substr(strstr($la_balise_lien, 'target='), 7);
						if (ereg(' ',$cible)) {//d'autres arguments après dans la balise
							$cible = str_replace (strstr($la_balise_lien, ' '), '' , $cible, 1);
						} else {//plus d'autres arguments après dans la balise
							$cible = str_replace (strstr($la_balise_lien, '>'), '' , $cible, 1);
						}
						$target = 'target='.$cible;
						$target_blank = 'target=_blank';
					}
					$la_balise_modifiee = str_replace ($target, $target_blank, $la_balise_lien); 
				}
				$html = str_replace ($la_balise_lien, $la_balise_modifiee, $zone1);	
			}
		}
		$curseur++;
	}
	return $html;
}
?>



Je rencontre actuellement le message suivant
Fatal error: Only variables can be passed by reference in ... on line 16

n'étant pas un expert de PHP, et encore moins en matière de conception de fonctions, j'aimerais comprendre pourquoi

Merci pour votre aide

A voir également:

3 réponses

tito23 Messages postés 305 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 16 janvier 2013 4
24 févr. 2011 à 12:30
Vous pouvez indiquer à quelle ligne correspond la ligne 16 dans ta page?
0
misterclic66 Messages postés 12 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 22 avril 2011
24 févr. 2011 à 13:37
La ligne 16 est
$cible = str_replace (strstr($la_balise_lien, '"'), '' , $cible, 1);
0
tito23 Messages postés 305 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 16 janvier 2013 4
24 févr. 2011 à 15:38
ce code sert à supprimer la chaine qui commence avec '"' dans $la_balise_lien de la chaine $cible?
sinon pouvez vous éclaircir le but de votre code.
0
misterclic66 Messages postés 12 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 22 avril 2011
25 févr. 2011 à 08:37
Voici une explication détaillée de ce que je veux fairedans cette fonction (n° de ligne = nb de lignes à partir de la déclaration function add_blank($html) qui est la ligne 1)

La variable $html est un texte saisi en HTML via un FCK Editor.
Il faut le traiter pour que toutes les balises <a href....> aient en sortie un attribut target="blank"

1 on crée un curseur ($curseur) qui détecte la présence de la séquence "<a " (début de la séquence d'une balise lien, l'espace sert à cerner uniquement les balises <a>, sans toucher les autres balises commençant par <a telles que <address>...

2 si on trouve cette séquence "<a ", alors la variable $la_balise_lien est la sous-chaine qui va de cette séquence jusqu'à ">" soit une balise lien ouvrante (L7), elle ne nous intéresse que si elle contient l'argument href= (L8) car les <a name....> ne sont pas concernés.

3 on s'interesse à la présence ou non de la séquence "target=" dans la variable $la_balise_lien

3.1 si tel n'est pas le cas, c'est simple, on remplace ">" par "target="_blank">" dans la variable $la_balise_lien
pour obtenir la variable $la_balise_modifiee et le tour est joué

3.2 s'il y a effectivement un attribut target, il faudra isoler sa valeur (la variable $cible) pour la remplacer par la chaine "_blank".
ce qui rend la chose complexe, c'est que la valeur de l'attribut target peut avoir été écrite dans le html original (souvent copié-collé par mon rédacteur) avec des " ", avec des ' ', ou avec rien du tout autour (pas propre mais on en trouve...) avec 2 sous-cas (fin de balise ou autres args après), d'ou quatre cas (L14, L19, L25, L27)
Dans ces 4 cas on modifie l'attribut target pour lui attribuer la valeur _blank, ce qui nos donne la variable $la_balise_modifiee

4 dans la variable $html on remplace la variable $la_balise_lien par la variable $la_balise_modifiee et on avance le curseur pour rechercher d'autres occurences de "<a "

l'erreur Fatal error: Only variables can be passed by reference in ... on line... correspond à la ligne 15 de la fonction.
Si qqn peut la corriger, voire l'améliorer car elle me paraît lente, je prends

Thx
0