Je me tourne vers vous afin que vous m'aidiez à comprendre comment je pourrai clôturer ma problématique.
Prenons un cas concret :
J'ai un texte de 30000 caractères au format html (utilisation de tinymce).
Mon objectif est de découper ce texte et de créer des pages
Ma base de données contient donc deux tables :
- "ARTICLES" => id_article, titre_article...
- "ARTICLES_PAGES" =>id_article,num_page,contenu_page'
Un article peut donc avoir 1 ou n page
Bien, maintenant, je regarde pour trouver une fonction qui découperait un code HTML sans briser les balises et je trouve :
<?php
/**
* Coupe une chaine en gardant le formatage HTML
* @param string $text Texte à couper
* @param integer $length Longueur à garder
* @param string $ending Caractères à ajouter à la fin
* @param boolean $exact Coupure exacte
* @return string
*/
function trunchtml($text, $length, $ending = '...', $exact = false) {
if(strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
return $text;
}
preg_match_all('/(<.+?>)?([^<>]*)/is', $text, $matches, PREG_SET_ORDER);
$total_length = 0;
$arr_elements = array();
$truncate = '';
foreach($matches as $element) {
if(!empty($element[1])) {
if(preg_match('/^<\s*.+?\/\s*>$/s', $element[1])) {
} else if(preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $element[1], $element2)) {
$pos = array_search($element2[1], $arr_elements);
if($pos !== false) {
unset($arr_elements[$pos]);
}
} else if(preg_match('/^<\s*([^\s>!]+).*?>$/s', $element[1], $element2)) {
array_unshift($arr_elements,
strtolower($element2[1]));
}
$truncate .= $element[1];
}
$content_length = strlen(preg_replace('/(&[a-z]{1,6};|&#[0-9]+;)/i', ' ', $element[2]));
if($total_length >= $length) {
break;
} elseif ($total_length+$content_length > $length) {
$left = $total_length>$length?$total_length-$length:$length-$total_length;
$entities_length = 0;
if(preg_match_all('/&[a-z]{1,6};|&#[0-9]+;/i', $element[2], $element3, PREG_OFFSET_CAPTURE)) {
foreach($element3[0] as $entity) {
if($entity[1]+1-$entities_length <= $left) {
$left--;
$entities_length += strlen($entity[0]);
} else break;
}
}
$truncate .= substr($element[2], 0, $left+$entities_length);
break;
} else {
$truncate .= $element[2];
$total_length += $content_length;
}
}
if(!$exact) {
$spacepos = strrpos($truncate, ' ');
if(isset($spacepos)) {
$truncate = substr($truncate, 0, $spacepos);
}
}
$truncate .= $ending;
foreach($arr_elements as $element) {
$truncate .= '</' . $element . '>';
}
return $truncate;
}
Ensuite, j’essaie ceci :
$texte = html_entity_decode(htmlspecialchars_decode('<p style="margin-bottom: 0in;">Un week end de septembre annoncé
magnifique en milieu de semaine par la météo. Il ne nous en faut
pas plus pour programmer une sortie sur deux jours dans le haut Jura.
Les deux plus hauts sommets du massif Jurassien devraient être alors
re-visités (<a title="Destination crêt de la neige!" href="/balades_pieds/voir_balades_pieds.php?numdep=1&dep=&voir_balade=121" target="_blank">voir balade</a>) mais cette fois-ci à quatre et en dormant
dans un refuge.</p>'));
$longueurTexte = strlen($texte);
$break = 100;
$nombrePages = ceil($longueurTexte/$break);
if ( $longueurTexte > 0 )
{
while ($nombrePages >= 1)
{
$resume = '';
// appel a la fonction et récupération du texte coupé
$resume = trunchtml($texte,$break);
$breakAjusting = strlen($resume);
// on enleve au texte le morceau qu'on a coupé
$texte = substr_replace($texte,'',0,$breakAjusting);
// On soustrait une page
$nombrePages--;
// On insere le résumé en base
echo $resume.'--------------------------------------------------------------<br />';
}
// s'il reste encore des caractères mais qu'on est plus dans le while
// c'est que le nombre restant est inferieur a la taille d'une page complete...
// On gère aussi le cas ou on est pas entré dans le while car le texte fait moins de 1000
// caractère (donc moins d'une page complete....
if ( strlen($texte) && ($nombrePages > 0 ))
{
echo $texte;
}
$msg = 'Tout est OK';
}
else
{
$msg = 'Texte manquant';
}
echo $msg;
Sauf que les coupures ne sont pas bonnes, le résultat sur le web est disponible ici : http://www.partir-en-vtt.com/test_trunc.php
Exemple :
Code : Tout sélectionner
Il ne nous en...
--------------------------------------------------------------
as plus pour programmer une sortie sur deux jours dans le haut Jura.Par avance, merci de me dire comment améliorer et réussir à résoudre ce souci.
@bientôt