8792 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

(J'espère que je poste dans la bonne section)

Je cherche un outil capable de ne conserver d'un doc html que l'essentiel, c'est à dire que les balises de type Hn, div, etc soit totalement limpide pour donner ceci par exemple :


<p style="text-align:left; margin-bottom:7px">truc</p>


devienne tout simplement


<p>truc</p>


Ca fait 2 heures que je cherche, et html tidy ne m'a pas enconre convaincu ou bien je me débrouille très mal…

Merci d'avance pour vos réponses Smiley cligne
Modérateur
Salut,

Je déplace dans le salon "Standards web et langages serveurs" parce que ton problème peut se résoudre via PHP et que je ne connais pas d'outils qui fassent ce genre de chose automatiquement...

Je laisse d'autres y répondre car, là, ça va me prendre toute la soirée... Smiley lol
(Je pratique pas des masses... Smiley langue )

Si tu n'as pas de réponse, oriente-toi sur les expressions régulières, preg_match, ereg_replace & co.

http://www.expreg.com/metacaracteres.php
http://www.expreg.com/eregreplace.php

... manque des trucs mais c'est par là... Smiley ravi

Tu peux aussi te renseigner sur divers forums PHP où tu y trouveras peut-être une réponse plus adaptée... Smiley cligne
Si c'est pour traiter 100 pages un peu longues, ça vaut le coup d'apprendre les expressions régulières (en Perl, en PHP, via des scripts SED ou autre)... ça sera toujours ça de pris. En dessous, l'intérêt est limité.
Sinon, rien du côté de NVU (vu qu'il regénère le code des pages via le DOM à chaque fois, il doit y avoir moyen de lui demander de ne conserver que certains types d'informations...), voire même d'Amaya ?
Salut,

Tu cherches une moulinette qui passe chaque page ou l'ensemble d'un répetoire?

Tu veux remplacer une suite de caractère identique à chaque fois ou autre? Dans le genre:

<p style="text-align:left; margin-bottom:7px">truc</p>
<p style="text-align:left; margin-bottom:7px">machin</p>


ou

<p style="text-align:left; margin-bottom:7px">truc</p>
<p style="text-align:right;">machin</p>
<p style="margin-bottom:7px">bidule</p>


et surtout, tu veux également remplacer certaines balises du genre <p bidules> en <hn> ?

a+
zzzazzz a écrit :

<p style="text-align:left; margin-bottom:7px">truc</p>

devienne tout simplement
<p>truc</p>


Première chose à faire, lister les balises à traiter.
Bonjour.

C'est une manip que j'ai eu l'occasion de faire pour rattraper du code généré par un clickodrome quelconque.

J'ai procédé comme suit:

J'ai fais un coup de tidy sur le code pour obtenir du xhtml, en vérifiant que l'essentiel était préservé. (notez qu'on peut faire du tidy en ligne, en cherchant l'adresse avec google...)
Ensuite, j'ai fait une transformation xslt avec le fichier xhtml en entrée, et une feuille xsl reprenant les balises voulues en autant de templates que de nécessaire.
Vous noterez le traitement des ancres et des images, et la recopie selective des attributs.


<xsl:stylesheet
 version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns="http://www.w3.org/TR/xhtml1/strict">

<xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="yes" />

	<xsl:template match="/">
		<xsl:apply-templates />
	</xsl:template>

	<xsl:template match="html">
		<html><xsl:apply-templates /></html>
	</xsl:template>

	<xsl:template match="body">
		<body><xsl:apply-templates /></body>
	</xsl:template>

	<xsl:template match="head">
		<head><xsl:apply-templates /></head>
	</xsl:template>

	<xsl:template match="title">
		<title><xsl:apply-templates /></title>
	</xsl:template>

	<xsl:template match="dir">
		<dir><xsl:apply-templates /></dir>
	</xsl:template>

	<xsl:template match="p">
		<p><xsl:apply-templates /></p>
	</xsl:template>

	<xsl:template match="table">
		<table><xsl:apply-templates /></table>
	</xsl:template>

	<xsl:template match="tr">
		<tr><xsl:apply-templates /></tr>
	</xsl:template>

	<xsl:template match="td">
		<td><xsl:apply-templates /></td>
	</xsl:template>


	<!-- balises à attribut obligatoire (href, src...) -->
	<xsl:template match="a">
		<a>
			<xsl:choose>
				<xsl:when test="@href" ><xsl:attribute name="href"><xsl:value-of select="@href" /></xsl:attribute></xsl:when>
				<xsl:when test="@target" ><xsl:attribute name="target"><xsl:value-of select="@target" /></xsl:attribute></xsl:when>
				<xsl:when test="@onclick" ><xsl:attribute name="onclick"><xsl:value-of select="@onclick" /></xsl:attribute></xsl:when>
			</xsl:choose>
			<xsl:apply-templates />
		</a>
	</xsl:template>

	<xsl:template match="img">
		<img>
			<xsl:choose>
				<xsl:when test="@src" ><xsl:attribute name="src"><xsl:value-of select="@src" /></xsl:attribute></xsl:when>
				<xsl:when test="@alt" ><xsl:attribute name="alt"><xsl:value-of select="@alt" /></xsl:attribute></xsl:when>
			</xsl:choose>
			<xsl:apply-templates />
		</img>

	</xsl:template>

	<!-- supression de b, u et i -->
	<xsl:template match="b">
		<xsl:apply-templates />
	</xsl:template>

	<xsl:template match="u">
		<xsl:apply-templates />
	</xsl:template>

	<xsl:template match="i">
		<xsl:apply-templates />
	</xsl:template>

	<!-- recopie de br -->
	<xsl:template match="br">
		<br />
	</xsl:template>

</xsl:stylesheet>


Cette transformation peut se faire de différente façon, avec php, python, et certainement aussi directement dans explorer ou firefox, en faisant passer le xhtml pour du xml vrai, et en indiquant la feuille de style... Le problème avec les navigateurs étant de récupérer le résultat...

C'est évidemment perfectible, car il faudrait au minimum copier les attributs class et id, rajouter les balises manquantes, mais tout ceci se fait en en tour de notepad.

Voilà, c'est une piste, à mon sens la plus facile à mettre en oeuvre. Car vu la complexité d'un html issu d'un clickodrome, envisager les expression régulières, peut être une expérience très enrichissante. Mais, bon.

Enfin, c'est réutilisable...

Si ça peut vous donner des idées...
Modérateur
Ah ? Je ne voyais pas ça comme ça à vrai dire... Smiley sweatdrop

Si le but était de supprimer tout attribut, j'aurais fait une recherche sur les espaces plutôt que de lister toutes les balises...

Si certains attributs doivent être conservés, ma recherche se serait portée sur eux...

Je pense que ça éviterait de pondre un code trop lourd...
C'est un truc que j'avais fait en cinq minutes pour résoudre mon problème d'alors qui était d'importer un fichier html wisiwig. Dans ces fichiers, le nombre de balises différentes est réduit au minimum majoritairement des <table> <tr> et <th>.

l'idée était d'adapter le xsl aux balises rencontrées, et de les rajouter en copier-collé...

Il est bien entendu possible de suprimer les attributs superflus avec autant de preg_replace que de nécessaire, mais le code que j'avais intégrait des attributs de la planête Mars et des balises inconnues au bataillon à destination du visualisateur wisiwig.

J'ai donc pris le problème à l'envers en décidant de choisir ce que je voulais conserver, au lieu d'effacer ce que je ne voulais pas, parce qu'à priori, celà donnait des surprises...
koala64 a écrit :
Si le but était de supprimer tout attribut, j'aurais fait une recherche sur les espaces plutôt que de lister toutes les balises...

Faire une recherche sur les espaces ?????
Tu fais quoi pour <a href ou <img src ????

Et quel est le problème de lister les balises à traiter, il n'y en a pas 20.000 que je sache ?

Ou mieux, de lister celles qui ne doivent pas être prises en compte comme dit juste avant <a href et <img src...
Modifié par Bison (28 Nov 2006 - 12:48)
Modérateur
Ben comme dit précédemment,
a écrit :
Si certains attributs doivent être conservés, ma recherche se serait portée sur eux...
J'ai peu de cas à traiter comparé aux 124 balises xhtml... (Je n'ai pas compté !)

Le but est surtout de savoir dans quelle mesure on nettoie et pour quoi c'est fait... S'il ne s'agit que des balises style à supprimer, on peut faire une recherche sur l'attribut style.
koala64 a écrit :
Le but est surtout de savoir dans quelle mesure on nettoie et pour quoi c'est fait...

Bah oui... suffit de le savoir !
Bonsoir,

Merci de vos commentaires, je cherchais (et cherche encore) quelque chose de plus simple que le regex.

L'idée est de conserver toutes les balises existentes mais réduites à leur plus simple expression. La solution en ligne tidy est une première approche inéressante mais largement insuffisante, puisque qu'elle laisse toutes les class et id.

Je me permet de laisser ce sujet ouvert, si je (ou quelqu'un d'autre) trouve une solution…
zzzazzz a écrit :
Bonsoir,

Merci de vos commentaires, je cherchais (et cherche encore) quelque chose de plus simple que le regex.

La regex !
Y a pas plus simple pour faire ce que tu veux.
zzzazzz a écrit :

L'idée est de conserver toutes les balises existentes mais réduites à leur plus simple expression.

Il est impossible de garder une balise img à sa plus simple expression.

zzzazzz a écrit :

Je me permet de laisser ce sujet ouvert, si je (ou quelqu'un d'autre) trouve une solution…

Je t'ai dit ce qu'il fallait faire :
- soit une liste complète des balises à traiter
- soit une liste exhaustive des balises à ne pas toucher

A partir de là, on pourra créer la regex adéquate.
Ok, dès que j'ai un moment, j'analyse plus en profondeur les docs que j'aurai à traiter et je fais un listing. Je partirai sans doute d'un doc pré-traité dans tidy, pour basculer la syntaxe en xhtml, et mettre tout les style="blalba" dans une balise <style> que je supprimerai de toute facon, il ne "resterait" que des class à supprimer.
J'apprends aussi un peu les regex mais j'avoue que je suis grand débutant, et qu'en ce moment je n'ai absolument pas le temps de m'y mettre (ni de trop participer au forum, hééélâaas Smiley cligne
En tout cas c'est super gentil…
Si tes balises a traiter ont toujours la même "écriture" et que tu dois les remplacer par quelquechose d'autres, sur plusieurs fichiers dans un même répertoire, et surtout s'il y en a peu: tu peux aussi te servir de Psad, il a une fonction rech/rempl sur tous les fichiers d'un même répertoire...
Bonjour,

Effectivement l'utilisation des expressions régulières est la méthode la plus simple et la plus rapide.

Via Sed il est possible d'effectuer cela :
sed 's/ style=.*"//' fichier.html > fichier_sortie.html

Tous les attributs "style" seront supprimés.
Bonjour.

tu peux te faire un script de ce genre. Tu as juste à ouvrir ton fichier et lire le contenu à la place de la chaine de test.

Ce code vire tout les attributs des balises. Si c'est bien cela que tu veux. Smiley biggrin


// chaine de test
$chaine = "<p class=\"centre\" id=\"id\"><span class=\"monSpan\">coucou</span></p><div id=\"monDiv\">division</div>";

// regex de traitement
$regex = "<([a-zA-Z]+)([^>]*)>";
$remplacement = "<\\1>";
	
// modification de la chaine
$chaineModifiee = eregi_replace($regex,$remplacement,$chaine);
	
echo htmlentities($chaine);
echo "<br />";
echo htmlentities($chaineModifiee);
Salut,
Zeke a écrit :
Ce code vire tout les attributs des balises. Si c'est bien cela que tu veux. Smiley biggrin
Attention, les noms d'éléments peuvent contenir des chiffres (par exemple h1).
Pages :