Bonjour,

Depuis pas mal de temps, je cherche à couper le texte HTML en gardant la mise en forme de celui-ci. En effet, j'écris des récits d'aventures qui font plusieurs milliers de mots. Pour le lecteur, j'ai préféré découper tout cela en page. Je me suis donc mis en quête d'une fonction. Après avoir trouvé et modifié une fonction, je suis arrivé à quelque chose de pas mal et qui fonctionne : Exemple de récit d'aventure : http://partir-en-vtt.com/periples_vt...r_periples=165

Le découpage permet d'alimenter une table stockant les caractères de la page 1,2,3...avec l'id du bon périple.

Il réside encore un souci (sinon je ne posterai pas !). En effet, parfois, le découpage coupe au milieu d'un mot et je ne trouve pas cela terrible.

Voici le code de la fonction couper_texte :

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
<?/**
 * 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($text)< $length)
	{
		$truncate = $text;
	}
	else
	{
 
		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 strlen($truncate);
}
?>
Et voilà comment j'exploite cette fonction :

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
	//calcul nb_page
			$nb_page = 0;
			$pages = array();
			//appel de couper_texte
 
			include($racine . '/inclusion/couper_texte_old.php');
			$nombreDeCaractParPage = intval(7000);
			$reste_contenu = $contenu;
 
			$indice_coupe = 7000;
			$cumul_coupe = 0;
 
			while ($indice_coupe >= $nombreDeCaractParPage )
			{
				$cumul_coupe += $indice_coupe;
				$indice_coupe = trunchtml($reste_contenu,$nombreDeCaractParPage);
				//echo $nb_page.'----';
				//$pages[$nb_page]['indice'] = $indice_coupe;
				//$pages[$nb_page]['cumul'] = $cumul_coupe;
				//$pages[$nb_page]['texte'] = substr($reste_contenu,0,$indice_coupe);;
 
				$nb_page++;
				$reste_contenu = substr($reste_contenu,$indice_coupe);
			}
Le code est un peu long mais j'espère que vous arriverez à m'aider et qu'il aidera quelques personnes cherchant cette fonction.

Par avance merci.