[PHP] Couper un code html en pages, et préserver les balises

WRInaute impliqué
J'ai un code HTML, mettons:
<p>aaa<b>xx</b></p>
Je veux le diviser pour l'afficher sur 2 pages différentes.

Si je le coupe net, j'ai:
page 1: <p>aaa<b>x
page 2: x</b></p>

Ca va pas.

Comment faire pour préserver le balisage ?

Je pense que le mieux est de dupliquer le balisage pour aboutir à cela:
page 1: <p>aaa<b>x</b></p>
page 2: <p><b>x</b></p>

Est-ce qu'un prince du PHP connaitrait une technique ultime et souhaiterait la partager, pour recueillir les honneurs et l'admiration de tous ?
 
WRInaute impliqué
Bien sûr ! Ce serait trop facile...
J'ai des codes longs et j'ai la flemme de faire défiler la barre.
:)
 
WRInaute passionné
Salut,

Est-ce qu'on pourrait connaitre le but de cette manipulation ?

Va falloir jouer du ereg, preg_match_all, preg_replace_callback et compagnie.
 
WRInaute impliqué
C'est sûr ! ça va regexper dans les chaumières ...
Le but est d'alléger les pages d'un site à dominante "graphique" avec une zone textuelle un peu trop lourde et chronologique (du plus récent au plus ancien). Je préfère garder une page d'entrée légère et récente.
C'est pas pour augmenter artificiellement le nombre de pages indexées, même si ça pourrait servir à ça.
 
WRInaute discret
Si tu es en php 5 en en XHTML, charges les fichiers avec simple_xml_load_file
Comme c'est chargé sous forme d'arbre, tu peux trouver assez facilement des règles pour couper aux bons endroits (couper au miliue d'un paragaphe ou d'un titre, c'est pas terrible). Tu fais ensuite tes modifs à l'aire des fonctions de type DOM (ex http://www.php.net/manual/fr/function.s ... dchild.php ), puis tu claques chaque bout dans un XML différent: http://www.php.net/manual/fr/function.s ... -asxml.php

Rigolo, non ?
 
WRInaute impliqué
Excellente piste, mais malheureusement je ne peux pas garantir la validité du code que je charge: impossible de le transformer en objet. Mais merci de l'idée. Argh, ça me renvoie sur des expressions régulières...
 
WRInaute discret
Transforme ton code avec Tidy avant ;)
Ou documente toi sur Tidy qui peux faire des choses bien sympa :wink:
 
WRInaute impliqué
Bon, merci de ces conseils. J'ai finalement opté pour des expressions régulières et j'ai abouti à une série de fonctions qui permettent de scinder un texte au un code html en plusieurs morceaux (pages) tout en gardant le balisage pour que l'affichage soit correct pour chacun des morceaux.

Je vais mettre mon code ici car: 1/ Si ça peut servir à quelqu'un tant mieux; 2/ C'est sûrement susceptible d'être amélioré; 3/ J'aime bien wri.

C'est censé être le plus léger et le moins gourmant possible... mais bon.

Code:
<?
$page_len=30; //longueur d'une page (en caractères)

//chaîne à diviser en plusieurs pages
$string="<div>
azerty<p>
qsdf,%<b>oiu</b> poi<u>uyt<a href=''>wxcvb 567
lkjh</a>jhg jhuytrhg kjhkk u ttrrf h.</u>fdsq<br />
loloploklo

</p></div>a";

//fonctions de division de chaîne
function callback_empty_tags($in) {
//echo "'".$in[1]."'|".strlen($in[1])."#";
return str_pad("",strlen($in[1]));
}
function callback_insert_words($in) {
return (str_pad("",strlen($in[1])).$in[2].str_pad("",strlen($in[3])));
}
function callback_add_splitter($in) {
return ">".wordwrap($in[1],100,"<a></a>")."<";
}
function strip_tags_offset(&$string) {
$string_without_tags=preg_replace_callback("`(<[^>]+>)`","callback_empty_tags",$string);
return $string_without_tags;
}
function string_add_splitters(&$string) {
$string_splitters=preg_replace_callback("`>([^<]+)<`","callback_add_splitter",$string);
return $string_splitters;
}
function show_page($string,$page_len) {
$string=string_add_splitters(preg_replace("`(\n|\r)`"," ","<a></a>".$string."<a></a>"));
$string_without_tags=strip_tags_offset(&$string);
preg_match_all("`(<[^>]+>)`",$string,$b,PREG_OFFSET_CAPTURE);
$num0=end($b[1]);
$num=($num0[1]>$num1[1])?$num0[1]:$num1[1];
//reset($b[1]);
$page_total=ceil($num/$page_len);
$p=1;
while ($p<=$page_total) {
$c=$string_without_tags;
$c=preg_replace_callback("`(.{".($page_len*($p-1))."})(.{0,".$page_len."})(.*)`","callback_insert_words",$c);
foreach ($b[1] as $k=>$v) {
$c=substr_replace($c,$v[0],$v[1],strlen($v[0]));
}
$out[$p]=preg_replace("`> +<`","><",preg_replace("` {2,}`"," ",$c));
$p++;
}
return $out;
}
//
$out=show_page($string,$page_len);
echo "<pre>";print_r($out);echo "</pre>";
?>
 
Discussions similaires
Haut