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 :

Problème RegExp, encore un [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Par défaut Problème RegExp, encore un
    Bonjour à toutes et tous,

    Sommairement :
    Issues d'une Bdd Mysql, je récupère des valeurs de champs textes saisis via htmlharea dans une variable PHP, le contenu de ces champs provient parfois d'un copier collé de texte Word.

    Un petit coup de traitements et je supprime quelques balises indésirables provoquant des erreurs pour la suite de mon script.
    Le hic est qu'il me reste des balises susceptibles d'être mal interprétées aussi, autant s'en séparer : ces balises (merci micr.soft...) ont des formats particuliers et bien sur dynamiques représentées comme suit :

    <st1:personname w:st="on">contenu très variable</st1:personname>
    ou
    <o:p></o:p>
    ou encore
    <st1 w:st="on">:</st1>
    J'ai testé plusieurs expressions sans le moindre résultat :
    if(mb_eregi("^</[a-z0-9.-_]:[a-z0-9.-_]>$", $TxtOut)) // par exemple
    if(mb_eregi('^<([a-z0-9.-_]:[a-z0-9.-_])(.*?)([a-z0-9.-_]:[a-z0-9.-_]=")(.*?)">$', $TxtOut)) ....

    Pourriez-vous me conseiller ? je précise que ma chaine de caractère contenant bien sur d'autre balises html classiques et validées.

  2. #2
    Membre averti
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Bonjour,
    Essaye ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg='^<[a-z0-9.-_]+:[a-z0-9.-_]+[ :="a-z]*>(.*)<[/a-z0-9.-_]+:[a-z0-9.-_]+>^';
    (j'ai utlisé preg_replace par contre, donc remplace p-e le dernier ^ par $ )

    un code qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $al='<st1:personname>contenu très vaariable</st1:personname>';
    echo (preg_replace ($reg,'\\1', $al)).'<br />';
    $al='<st1:personname w:st="on">contenu très variable</st1:personname>';
    echo (preg_replace ($reg,'\\1', $al)).'<br />';
     
    $al='<o:p>contenu très variable</o:p>';
    echo (preg_replace ($reg,'\\1', $al));
     
    /* changement de regexp */
    $reg='^<st1.*>(.*)</st1>^';
    $al='<st1 w:st="on">:</st1>';
    echo (preg_replace ($reg,'\\1', $al)).'<br />';
    J'ai juste modifié ta regExp pour qu'elle tourne, mais je ne me suis posé aucune question théologique ou fondamentale :p (Ca marche, mais je sais pas si c'est "beau")

    La derniere ligne n'est pas parsée avec la reg1, de peur d'être trop "vague" après et de degager du html .
    Si des pros du htaccess te filent une réponse plus generique, ca serait nickel, mais sinon on peut aussi en utiliser la deuxième reg proposée:
    $reg='^<st1.*>(.*)</st1>^';
    L'avantage est que tu es sur de pas remplacer de HTML, le problème est qu'il t'en faut du coup une par balise .


    note que c'est du temporaire, attends des réponses plus abouties des profs .
    Bonne continuation .
    Sayn.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Par défaut
    Désolé mais en ce qui me concerne ça ne donne rien :

    si je teste sur une chaine type,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <b><span style="font-family: Verdana;">Su<span style="font-style: italic;">per test à fa</span>ire !!!!!</span><br><o:p></o:p></b><o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="PersonName">&nbsp;</o:smarttagtype>
    j'utilise ton code pour test dans la fonction suivante après tout on s'entraide
    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
    function SupCodWord2($Txt)
    {   
     
        if($Txt==''){ 
        	return '';
        }else{
     
    		$tmp0 = $Txt;
    		echo  "<br>L 61 --------> ".$tmp0."<br>";
    		//$tmp0 = strip_tags($tmp0); echo  "<br>L 61 --------> ".$tmp0."<br>";
    		if(mb_eregi('</style>
    <![endif]-->
     
    ',$tmp0)){
    			$tmp0 = explode('</style>
    <![endif]-->
     
    ',$tmp0);
    			// --  
        		echo  "<br>L 72 --------> ".$tmp0[0]."<br>"; 
    			$TxtOut = $tmp0[1]; 
    			echo  "<br>L 74 --------> ".$TxtOut."<br>";
     
    		}else{
    			$TxtOut = $tmp0; 
    			echo  "<br>L 78 --------> ".$tmp0[0]."<br>"; 
    		}
    		// surcharge 
        	$TxtOut = mb_ereg_replace(' class="MsoNormal"','',$TxtOut);
        	echo  "<br>L 82 --------> ".$TxtOut."<br>";
     
     		$reg='^<[a-z0-9.-_]+:[a-z0-9.-_]+[ :="a-z]*>(.*)<[/a-z0-9.-_]+:[a-z0-9.-_]+>^';
    		$TxtOut = preg_replace ($reg,'\\1', $TxtOut);
        	echo  "<br>L 86 --------> ".$TxtOut."<br>";
     
    		/*$reg2='^<st1.*>(.*)</st1>^';
    		$TxtOut = preg_replace ($reg2,'\\1', $TxtOut);	
    		*/		
    		$reg3='^<.*[a-zA-Z0-9.-_]+:[a-zA-Z0-9.-_]*>(.*)</.*[a-zA-Z0-9.-_]+:[a-zA-Z0-9.-_]*+>^';	
    		$TxtOut = (preg_replace ($reg3,'\\1', $TxtOut));
     
    		echo  "<br>L 94 --------> ".$TxtOut."<br>";
    	}
    }
    au final donc rien ne change ... ou bien je suis trop fatigué pour ne pas voir l'évidence ou bien je dois aller faire un tour chez m'sieur neurones pour préparer une commande et livraison

  4. #4
    Membre averti
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Re!

    J'ai découpé le problème en deux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $regdeb='$<[a-z0-9]+\:[a-z0-9]+[^>]*>$';
    $regfin='$</[a-z0-9]+\:[a-z0-9]+>$';
     
    $al='<b><span style="font-family: Verdana;">Su<span style="font-style: italic;">per test à fa</span>ire !!!!!</span><br><o:p></o:p></b><o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="PersonName">&nbsp;</o:smarttagtype>';
    et ca marche. Je ne connais aps de balises html de cette forme :

    <qqch:autrechose> et idem pour fermant, donc ca semble convenir.
    Je regarde rapidos pour celui de la forme:
    <qqch qqchautre:qqchtrois>

    Dit moi si cela te conviens .
    Sayn.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Par défaut

    attention ce monsieur est un violent : et comment que ça marche !
    et puis un 3ème car il le vaut bien
    effectivement deux passages s'avèrent nécessaires et c'est d'ailleurs plus simple à localiser.
    Ces balises sont issues d'un copié collé de texte ouvert sous microS..t Word, genre 2003-2007 collé dans un textarea géré sous htmlarea et inséré en vrac dans un Bdd Mysql !! => pourquoi faire simple ?

    Cependant concernant les balises du genre :
    <qqch qqchautre:qqchtrois>
    je me demande si cela pourrait marcher => '$<[a-z0-9]* [a-z0-9]+\:[a-z0-9]+>$' , je vais tester et te tiens informé, et surtout MERCI !

  6. #6
    Membre averti
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Et voila
    regdeb et regfin c'est pour supprimer celles "normales":
    <qqch:autre cequevousvoulez>

    un petit match pour trouver balises
    <nombalise aaa:cequevousvoulez>, dont on va retenir juste "nombalise".
    Ensuite, on fait un replace des </nombalise>
    et ensuite on fait un replace des balises d'ouvertures

    Probablement pas optimisé, avec des risques d'erreurs , mais ca a l'air de marcher . Mais attends vraiment le passage des experts, ca t'evitera des deconvenues .

    Un petit truc, la balise <balise style='color:red'> n'aura aucun problème car avant le : on ne doit avoir que des lettres ou chiffres. Par contre, si tu as <balise qqch:autrechose> ca va etre viré

    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
     
    <?php 
    $regdeb='$<[a-z0-9]+\:[a-z0-9]+[^>]*>$';
    $regfin='$</[a-z0-9]+\:[a-z0-9]+>$';
     
    $regdeux='$<([a-z0-9]+) [a-z0-9]+:[^>]*>$';
     
     
    $al='<b><span style="font-family: Verdana;">Su<span style="font-style: italic;">per test à fa</span>ire !!!!!</span><br><o:p></o:p></b><o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="PersonName">&nbsp;</o:smarttagtype><st1 w:st="on">youpi ca marchee aussi</st1>';
     
    $al=(preg_replace ($regdeb,'\\1', $al));
    $al=(preg_replace ($regfin,'\\1', $al));
    preg_match($regdeux,$al,$test);
    foreach($test as $key => $val){
      if($key){
        $al=preg_replace('$</'.$val.'>$','',$al);  
      }
    }
    $al=preg_replace($regdeux,'',$al);
    echo $al;
    Je retourne bosser !
    Bonne soirée,
    Sayn.

    PS: ca a l'air d'etre un beau bazard tout ca . Bon courage pour la suite :p.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Par défaut
    résultat de test

    chaine en test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $t='<qqch qqchautre:qqchtrois>blablabla</qqch qqchautre:qqchtrois>';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $regdeb='$<[a-z0-9]* [a-z0-9]+\:[a-z0-9]+[^>]*>$';
     
    $regfin='$</[a-z0-9]* [a-z0-9]+\:[a-z0-9]+>$';
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $t = (preg_replace ($regdeb,'\\1', $t));
    ça corrige déjà la balise de début et de fin ???? je m'interroge donc sur le fait que ça puisse me supprimer en cascade toutes les balises rencontrées ensuite ...

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

Discussions similaires

  1. Problème regexp \1
    Par max3513 dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2015, 17h58
  2. problème regexp et accents
    Par umbre42 dans le forum Général Python
    Réponses: 2
    Dernier message: 30/06/2011, 14h14
  3. Problème fieldset : Encore une différence FF et IE7
    Par BassT4ken dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 27/03/2009, 09h31
  4. Problème regexp
    Par L0rent dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/04/2006, 11h59
  5. Problème regexp
    Par Yux dans le forum Langage
    Réponses: 8
    Dernier message: 18/02/2006, 19h41

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