IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problemes d'expression reguliere [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Essaie de remplacer cette deuxieme ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html = preg_replace("<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>", "<$1$2>", $html);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 5
    Par défaut
    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 ']'

  4. #4
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Mais quand il font un copié-coller de leur page sur fckeditor, ce dernier nettoie le code ?

    Sinon pour ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html = preg_replace("`([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|\"[^\"]*\"|[^>]+)([^>]*)`", "<$1$2>", $html);

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 5
    Par défaut
    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.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 5
    Par défaut
    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 ?

  7. #7
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Tu as pensé à Tidy ?
    http://php.net/tidy

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 5
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme avec expression reguliere
    Par naourass dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/11/2005, 12h15
  2. [langage]Probleme d'expression reguliere
    Par Slippers dans le forum Langage
    Réponses: 2
    Dernier message: 29/06/2005, 17h45
  3. Réponses: 7
    Dernier message: 16/07/2004, 13h24
  4. [langage] Problème d'expression régulière
    Par xavro dans le forum Langage
    Réponses: 11
    Dernier message: 13/07/2004, 14h48
  5. [langage] Problème d'expression régulière
    Par And_the_problem_is dans le forum Langage
    Réponses: 7
    Dernier message: 22/03/2004, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo