IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Équivalent de la fonction text de Jquery mais en PHP [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut Équivalent de la fonction text de Jquery mais en PHP
    Bonjour,

    J'ai un texte qui contient des balises HTML <a href...></a> et je voudrais ne prendre que les 200 premiers caractères du texte affiché, c'est à dire sans les balises HTML.

    Existe t-il en PHP une fonction équivalente à text de JQuery qui est capable de le faire ?

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 239
    Points
    20 239
    Par défaut
    Une association de strip_tags et substr peut être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $chaine = '<a>texte....</a>';
    $short = substr(strip_tags($chaine),0,200);

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je n'arrive pas à avoir ce que je veux...

    Mon problème est lié à ces deux discussions :
    - Réduire une URL dans un texte et la rendre active ;
    - Implémenter un lien "Lire la suite"

    Voilà le casse tête...

    A) Le texte ne contient pas d'url
    => Pas de problème, j'affiche les 200 premiers caractères.

    B) Le texte contient une url au milieu des 200 caractères.
    Si l'ensemble "texte + balise <a> + lien raccourci pour l'affichage + balise </a>" ne dépasse pas les 200 caractères, pas de problème, le texte est correctement formaté.

    Si l'ajout des balises déplace l'url à la limite des 200 caractères, le lien est cassé et envoie vers une belle erreur 404 !

    C) Le texte contient une url coupée par la limite des 200 caractères.
    => Idem, l'url est cassée !

    L'idéal serait de n'afficher que les 200 premiers caractères mais que tous les liens qui figurent dans ces 200 caractères soient pleinement actifs.

    Avec strip_tags, je supprime les tags de la chaîne à envoyer au navigateur donc ce n'est pas bon.

    preg_replace_callback est bien pratique pour détecter les url et les rendre actives.

    Comme j'extrais les 460 premiers caractères de la BDD, je peux avoir l'url complète qui serait coupée par la limite des 200 caractères à afficher.

    En gros, j'ai tous les éléments, des méthodes efficaces individuellement mais pas ensemble !

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    OUF !
    J'ai fini par y arriver !

    Voici la solution, pour ceux que ça intéresserait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    /**
     * formateMsg
     * Formate un message ou un commentaire à afficher sur le mur
     * - Détecte les URL et les active
     * - Raccourcit les liens affichés à 30 caractères
     * - Réduit le texte affiché à ses 200 premiers caractères une fois les liens réduits
     * @param string message : Le message à traiter
     * @param string typemsg : LE type de message à traiter
     * @return array : Le message formaté
     */
    function formateMessage($message, $typemsg)
    {
    	global $trad_read_more;
    	global $id_msg;
    	global $la_langue;
     
    	// Longueur maxi du texte à afficher pour le message
    	$limite = 200;
     
    	// Faut-il ajouter le lien 'Lire la suite' ?
    	$suite = FALSE;
     
    	// Les URL détectées commencent par 'www', 'http://' ou 'https://'
    	$pattern = '`(https?://|www)([a-zA-Z0-9\/.\-_+?&=#]+)`';
     
    	/* Nombre d'url trouvées dans le texte.
    	 * Le sous-tableau $matches[0] contient les urls trouvées
    	 * Le sous-tableau $matches[1] contient les racines d'url trouvées par rapport au pattern
    	 */
    	$nb_url = preg_match_all($pattern, $message, $matches);
     
    	if($nb_url > 0)
    	{
    		// Calcul du texte à afficher s'il contient des URL
     
    		$restetexte = $message;
    		$debuttexte = '';
    		$message_final = '';
     
    		foreach($matches[0] as $clef => $valeur)
    		{
    			// Pour chaque URL trouvée dans le message
     
    			// Si l'URL du texte commence par www, on ajoute http à l'adresse href
    			$adresse = ($matches[1][$clef] == 'www') ? 'http://' . $valeur : $valeur;
     
    			// Raccourcissement du lien
    			if($matches[1][$clef] == 'www')
    			{
    				// Si le lien commence par 'www', on supprime 'www.'
    				$lien = substr($valeur, 4);
    			}
    			elseif($matches[1][$clef] == 'https://')
    			{
    				if(substr($valeur, 8, 3) == 'www')
    				{
    					$lien = substr($valeur, 12); // on commence après "https://www."
    				}
    				else
    				{
    					$lien = substr($valeur, 8); // on commence après "https://"
    				}
    			}
    			elseif($matches[1][$clef] == 'http://')
    			{
    				if(substr($valeur, 7, 3) == 'www')
    				{
    					$lien = substr($valeur, 11); // on commence après "http://www."
    				}
    				else
    				{
    					$lien = substr($valeur, 7); // on commence après "http://"
    				}
    			}
     
    			// Raccourcissement du lien à ses 30 premiers caractères
    			$lien = substr($lien, 0, 30);
     
    			// Composition du message à afficher
    			$morceaux = array();
    			$morceaux = explode($valeur, $restetexte);
     
    			if(strlen($debuttexte.$morceaux[0]) > $limite
    					|| strlen($debuttexte.$morceaux[0].$lien) > $limite
    			)
    			{
    				// Si la longueur de l'ensemble
    				// (début du texte composé jusqu'ici
    				// + le texte précédent la prochaine URL)
    				// ou du même ensemble + la prochaine URL
    				// est trop long, on coupe à la limite sans la prochaine URL et on sort de la boucle
    				$textecompose = substr($debuttexte.$morceaux[0], 0, $limite);
    				$message_final = $debuttexte_avec_url.substr($morceaux[0], 0, ($limite - strlen($debuttexte)));
    				$suite = TRUE;
    				break;
    			}
    			else
    			{
    				// Sinon, on continue de composer le texte
    				$debuttexte .= $morceaux[0].$lien;
    				$restetexte = $morceaux[1];
    				$textecompose = $debuttexte.$restetexte;
     
    				$debuttexte_avec_url .= $morceaux[0].'<a href="'.$adresse.'" class="urldansmsg" target="_blank" >'.$lien.'</a>';
    				$message_final = $debuttexte_avec_url.$restetexte;
    			}
    		} // Fin foreach($matches[0] as $clef => $valeur)
    	} // Fin if($nb_url > 0)
    	else
    	{
    		// Texte à afficher s'il ne contient pas d'URL
    		$message_final = substr($message, 0, $limite);
    		if(strlen($message) > $limite)
    		{
    			$suite = TRUE;		
    		}
    	} // Fin du else de if($nb_url > 0)
     
    	if($suite)
    	{
    		$message_final .= '...&nbsp;';
    		$message_final .= '<a href="javascript:readMore('.$id_msg.", '$la_langue', '$typemsg')".'"';
    		$message_final .= 		'class="souligneSurvol"';
    		$message_final .= '>';
    		$message_final .= $trad_read_more;
    		$message_final .= '</a>';
    	}
    	return $message_final;
    }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour CinePhil,
    tu as aussi cette fonction : Fonctions de troncature de texte : "Résumé html"
    Cette fonction a été créé pour formater des résumés de textes issus d'éditeurs WYSIWYG.
    Création en juin 2009 en collectif : Xunil, jreaux62, s.n.a.f.u., christele_r, Doksuri, Patouche.

    -> Le résumé est affiché formaté, en conservant la mise en forme HTML du contenu ;
    -> les balises html sont conservées (ce qui permet aussi d'afficher les smileys !) ;
    -> le texte est tronqué à une nombre de caractères donné, en évitant de couper un mot.

    Et si tu ne souhaites conserver que les liens <a ...></a>, il te suffit de mettre au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function texte_resume_html($texte, $nbreCar)
    {
    	$allowable_tags			= '<a>'; // on ne garde que les liens
    	$texte 				= strip_tags($texte, $allowable_tags);
    	// ---------------------
    Et pourquoi pas, toujours grâce à strip_tags (), conserver aussi les textes en gras ? (ou toute autre balise !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function texte_resume_html($texte, $nbreCar)
    {
    	$allowable_tags			= '<a><b><strong>'; // on ne garde que les liens + textes gras
    	$texte 				= strip_tags($texte, $allowable_tags);
    	// ---------------------
    NB : contrairement à ta méthode, les liens relatifs sont aussi conservés.
    <a href="../../accueil.php">accueil</a> fonctionne.

    (PS : la fonction, une fois enlevés tous les commentaires, ne fait qu'une cinquantaine de lignes)
    Dernière modification par Invité ; 17/09/2012 à 08h47.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Ben dommage que mes recherches ne m'aient pas orienté là-dessus car au vu de la description cela semble correspondre à mon besoin... et ça fait plusieurs semaines que je cherche la solution !

    Mais maintenant que j'ai trouvé, je pense que je vais rester à ma fonction pour le moment.
    J'étudierai ce tuto plus tard.

    Merci quand même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Fichiers&Repertoires] équivalence d'une fonction C# ?
    Par bakonu dans le forum Général Java
    Réponses: 9
    Dernier message: 09/06/2006, 10h26
  2. Réponses: 5
    Dernier message: 21/03/2006, 15h00
  3. Réponses: 4
    Dernier message: 18/01/2006, 14h49
  4. Réponses: 16
    Dernier message: 20/12/2005, 14h54
  5. [String] équivalent de la fonction eval() en javascript
    Par jeyce dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 01/09/2004, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo