Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/03/2006, 11h36   #1
Invité de passage
 
Inscription : mars 2002
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 5
Points : 1
Points : 1
Envoyer un message via ICQ à ToURisT
Par défaut Problemes d'expression reguliere

Bonjour,

Je pense que beaucoup de personne on eu ce probleme, j'ai une
admin et les redacteurs mettre du code HTML de word (2003) ce qui fait
que l'affichage est long, moche et inutilement chargé de balise
exotique made in MS.

J'ai testé de nombreux soft gratuit et non gratuit, et la quasi
totalité nettoye tres mal le code. J'ai testé aussi divers outils en
ligne, dont un particulierement performant basé surement sur des
expressions reguliere (textism).

Et j'ai trouvé une fonction en C# que j'ai voulu adapté pour php
mais mes lacunes en expression reguliere font que j'ai un probleme
de code.

Code sources C# :
Code :
1
2
3
4
5
6
7
8
9
10
 
private string CleanHtml(string html)
{ 
    // start by completely removing all unwanted tags 
    html = Regex.Replace(html, @"<[/]?(font|span|xml|del|ins|[ovwxp]:\w+)[^>]*?>", "", RegexOptions.IgnoreCase); 
    // then run another pass over the html (twice), removing unwanted attributes 
    html = Regex.Replace(html, @"<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>","<$1$2>", RegexOptions.IgnoreCase); 
    html = Regex.Replace(html, @"<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>","<$1$2>", RegexOptions.IgnoreCase); 
    return html;
}

Code sources PHP :
Code :
1
2
3
4
5
6
7
function CleanHtml($html)
{ 
   $html = preg_replace("<[/]?(font|span|xml|del|ins|[ovwxp]:\w+)[^>]\*?>", "", $html);  
   $html = preg_replace("<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>", "<$1$2>", $html); 
   $html = preg_replace("<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>", "<$1$2>", $html); 
    return $html;
}
Erreur généré :
- T_CONSTANT_ENCAPSED_STRING (sur la 2eme ligne).

References :
- http://tim.mackey.ie/CleanWordHTMLUs...pressions.aspx
- http://www.lifehacker.com/software/w...nts-133360.php
- http://textism.com/wordcleaner/


Si vous avez une idées pour ce code, je vous remerci, ou tout autre
proposition performante alternative :)

Merci beaucoup,
AuReL
ToURisT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2006, 11h41   #2
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Essaie de remplacer cette deuxieme ligne :
Code :
$html = preg_replace("<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>", "<$1$2>", $html);
par
Code :
$html = preg_replace("<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|\"[^\"]*\"|[^>]+)([^>]*)>", "<$1$2>", $html);
Sinon pourquoi pas utiliser un editeur wysiwyg à la mode, qui, parait-il, nettoie automatiquement le code microsoftien ?
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2006, 11h44   #3
Invité de passage
 
Inscription : mars 2002
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 5
Points : 1
Points : 1
Envoyer un message via ICQ à ToURisT
Oui j'ai integre un editeur wysiwyg a la mode (genre fckEditor), mais
les redacteurs ne veulent pas bossé sur le "web" directement.

Enfin apres moult debat, j'ai dit que j'essairais de trouvé une solution
alternative a ca.

Je vais essayer, en tout cas, merci :)


Resultat de la modification :
Warning: preg_replace(): Unknown modifier ']'
ToURisT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2006, 11h54   #4
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Mais quand il font un copié-coller de leur page sur fckeditor, ce dernier nettoie le code ?

Sinon pour ta ligne :
Code :
$html = preg_replace("`([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|\"[^\"]*\"|[^>]+)([^>]*)`", "<$1$2>", $html);
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2006, 11h55   #5
Invité de passage
 
Inscription : mars 2002
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 5
Points : 1
Points : 1
Envoyer un message via ICQ à ToURisT
Ca marche pas super le copier coller depuis word en faite, vue que j'voudrais gardé ma validation XHTML 1.1...


Resultat :

Ca marche, mais ca clean vraiment tout ! lol
Il reste juste encore des "<" et des ">" un peu partout.


En tout cas merci, si jamais ta une idée pour le nettoyage. Microsoftien je suis aussi preneur.
ToURisT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2006, 12h05   #6
Invité de passage
 
Inscription : mars 2002
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 5
Points : 1
Points : 1
Envoyer un message via ICQ à ToURisT
Balise restante du fckEditor :

<!--[endif]-->
<!--[if !supportLists]-->

+ les balise de styles qui sont non valide XHTML 1.1
(ouais bon d'accord je fais le difficile lol).

Remarque, j'pense qu'on peut virée d'une seule traite tout les
commentaires HTML ?
ToURisT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2006, 12h06   #7
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Tu as pensé à Tidy ?
http://php.net/tidy
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2006, 12h11   #8
Invité de passage
 
Inscription : mars 2002
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 5
Points : 1
Points : 1
Envoyer un message via ICQ à ToURisT
Non je n'avais pas regardé, ca me semble tres interessant.
Pour fckEditor et pour ce que ca interesse, voila la fonction
du cleanWord

Code source javascripts :
Code :
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
function CleanWord( html )
{
	var bIgnoreFont = document.getElementById('chkRemoveFont').checked ;
	var bRemoveStyles = document.getElementById('chkRemoveStyles').checked ;
 
	html = html.replace(/<o:p>\s*<\/o:p>/g, "") ;
	html = html.replace(/<o:p>.*?<\/o:p>/g, "&nbsp;") ;
 
	// Remove mso-xxx styles.
	html = html.replace( /\s*mso-[^:]+:[^;"]+;?/gi, "" ) ;
 
	// Remove margin styles.
	html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*;/gi, "" ) ;
	html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*"/gi, "\"" ) ;
 
	html = html.replace( /\s*TEXT-INDENT: 0cm\s*;/gi, "" ) ;
	html = html.replace( /\s*TEXT-INDENT: 0cm\s*"/gi, "\"" ) ;
 
	html = html.replace( /\s*TEXT-ALIGN: [^\s;]+;?"/gi, "\"" ) ;
 
	html = html.replace( /\s*PAGE-BREAK-BEFORE: [^\s;]+;?"/gi, "\"" ) ;
 
	html = html.replace( /\s*FONT-VARIANT: [^\s;]+;?"/gi, "\"" ) ;
 
	html = html.replace( /\s*tab-stops:[^;"]*;?/gi, "" ) ;
	html = html.replace( /\s*tab-stops:[^"]*/gi, "" ) ;
 
	// Remove FONT face attributes.
	if ( bIgnoreFont )
	{
		html = html.replace( /\s*face="[^"]*"/gi, "" ) ;
		html = html.replace( /\s*face=[^ >]*/gi, "" ) ;
 
		html = html.replace( /\s*FONT-FAMILY:[^;"]*;?/gi, "" ) ;
	}
 
	// Remove Class attributes
	html = html.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
 
	// Remove styles.
	if ( bRemoveStyles )
		html = html.replace( /<(\w[^>]*) style="([^\"]*)"([^>]*)/gi, "<$1$3" ) ;
 
	// Remove empty styles.
	html =  html.replace( /\s*style="\s*"/gi, '' ) ;
 
	html = html.replace( /<SPAN\s*[^>]*>\s*&nbsp;\s*<\/SPAN>/gi, '&nbsp;' ) ;
 
	html = html.replace( /<SPAN\s*[^>]*><\/SPAN>/gi, '' ) ;
 
	// Remove Lang attributes
	html = html.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
 
	html = html.replace( /<SPAN\s*>(.*?)<\/SPAN>/gi, '$1' ) ;
 
	html = html.replace( /<FONT\s*>(.*?)<\/FONT>/gi, '$1' ) ;
 
	// Remove XML elements and declarations
	html = html.replace(/<\\?\?xml[^>]*>/gi, "") ;
 
	// Remove Tags with XML namespace declarations: <o:p></o:p>
	html = html.replace(/<\/?\w+:[^>]*>/gi, "") ;
 
	html = html.replace( /<H\d>\s*<\/H\d>/gi, '' ) ;
 
	html = html.replace( /<H1([^>]*)>/gi, '<div$1><b><font size="6">' ) ;
	html = html.replace( /<H2([^>]*)>/gi, '<div$1><b><font size="5">' ) ;
	html = html.replace( /<H3([^>]*)>/gi, '<div$1><b><font size="4">' ) ;
	html = html.replace( /<H4([^>]*)>/gi, '<div$1><b><font size="3">' ) ;
	html = html.replace( /<H5([^>]*)>/gi, '<div$1><b><font size="2">' ) ;
	html = html.replace( /<H6([^>]*)>/gi, '<div$1><b><font size="1">' ) ;
 
	html = html.replace( /<\/H\d>/gi, '</font></b></div>' ) ;
 
	html = html.replace( /<(U|I|STRIKE)>&nbsp;<\/\1>/g, '&nbsp;' ) ;
 
	// Remove empty tags (three times, just to be sure).
	html = html.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' ) ;
	html = html.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' ) ;
	html = html.replace( /<([^\s>]+)[^>]*>\s*<\/\1>/g, '' ) ;
 
	// Transform <P> to <DIV>
	var re = new RegExp("(<P)([^>]*>.*?)(<\/P>)","gi") ;	// Different because of a IE 5.0 error
	html = html.replace( re, "<div$2</div>" ) ;
 
	return html ;
}
En tout cas merci, avec une combinaison de plusieurs methodes,
je pense que la conversion pourra etre performante... Je verrais
plus tard pour ca conformité XHTML 1.1. lol
ToURisT est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h18.


 
 
 
 
Partenaires

Hébergement Web