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

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


Tilt
WRInaute passionné
WRInaute passionné
 
Messages: 818
Inscription: Sam Mar 26, 2005 11:48

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

Message le Lun Aoû 28, 2006 22:42

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 ?


cprail
WRInaute accro
WRInaute accro
 
Messages: 1564
Inscription: Dim Mar 05, 2006 20:09

Message le Lun Aoû 28, 2006 22:45

Tu veux faire celà systématiquement sur un grand nombre de codes automatiquement?


Tilt
WRInaute passionné
WRInaute passionné
 
Messages: 818
Inscription: Sam Mar 26, 2005 11:48

Message le Lun Aoû 28, 2006 23:03

Bien sûr ! Ce serait trop facile...
J'ai des codes longs et j'ai la flemme de faire défiler la barre.
:)


dorian53
WRInaute accro
WRInaute accro
 
Messages: 1901
Inscription: Dim Avr 10, 2005 16:56

Message le Lun Aoû 28, 2006 23:04

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.


Tilt
WRInaute passionné
WRInaute passionné
 
Messages: 818
Inscription: Sam Mar 26, 2005 11:48

Message le Lun Aoû 28, 2006 23:28

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.


obi
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 238
Inscription: Mer Juil 26, 2006 10:53

Message le Lun Aoû 28, 2006 23:41

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 ?


Tilt
WRInaute passionné
WRInaute passionné
 
Messages: 818
Inscription: Sam Mar 26, 2005 11:48

Message le Mar Aoû 29, 2006 0:07

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...


Dmx
WRInaute impliqué
WRInaute impliqué
 
Messages: 256
Inscription: Mer Avr 07, 2004 13:34

Message le Mar Aoû 29, 2006 8:57

Transforme ton code avec Tidy avant ;)
Ou documente toi sur Tidy qui peux faire des choses bien sympa :wink:


Tilt
WRInaute passionné
WRInaute passionné
 
Messages: 818
Inscription: Sam Mar 26, 2005 11:48

Message le Mar Aoû 29, 2006 14:50

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: 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>";
?>


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités