[PHP] Couper un code html en pages, et préserver les balises
9 messages
• Page 1 sur 1
- Tilt
- WRInaute impliqué

- Messages: 858
- Inscription: 26 Mar 2005
[PHP] Couper un code html en pages, et préserver les balises
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 ?
<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 ?
- Tilt
- WRInaute impliqué

- Messages: 858
- Inscription: 26 Mar 2005
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.
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.
-

obi - WRInaute discret

- Messages: 238
- Inscription: 26 Juil 2006
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 ?
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 ?
- Tilt
- WRInaute impliqué

- Messages: 858
- Inscription: 26 Mar 2005
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.
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: Tout sélectionner
<?
$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>";
?>
9 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- Remplacer du texte entre balises par un code en php
- [php] couper un texte lors de l'affichage
- PHP et MagpieRSS, couper une chaine de caractères
- Comment préserver son adresse Gmail
- Balises DC (Dublin Code)
- Balises H1 - position dans le code et CMS
- La validité du code HTML, balises et attributs
- code sources des balises méta
- ou sont les balises H1 et H2 dans le code source?
- Comment convertir un code HTML en code PHP ?
Consultez la description détaillée des produits ou services de Google suivants : Google Code
- Analyse de l'entête HTTP
Cet outil vous permet de connaître le code HTTP renvoyé par le serveur pour une page donnée.
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités




