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 :

Adapter l'ordre des propriétés d'une balise [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut Adapter l'ordre des propriétés d'une balise
    Bonjour,

    Je souhaite utiliser ce motif pour extraire les propriétés d'une balise :

    '/prop1="(.*)".*prop2="(.*)".*prop3="(.*)"/im'
    Pour extraire les données de :

    '<balise prop1="aaa" prop2="bbb" prop3="ccc" />'
    Seulement si l'ordre vient à changer :

    '<balise prop3="aaa" prop1="bbb" prop2="ccc" />'
    L'expression régulière ne fonctionne plus.

    Existe t'il un moyen de régler ce problème ?

    Merci

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    ya probablement une meilleure solution cependant à défaut de mieux capture comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '#<([:alpha:]+)/s+([:alpha:]+)="([^"]*)"/s*/?>#'
    grosso modo, tu captures le nom de l'attribut en même temps que sa valeur.
    Si c'est pour analyser du xml ya des solutions buildin php, ça sera plus efficace.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Non, ce n'est pas pour parser du xml mais pour récupérer les <link> dans le head des pages web. Les propriété ne sont pas toujours dans le même ordre.

    Sinon je peux créer un motif pour chacune des possibilité :

    prop1 = '' prop2 = '' prop3 = ''
    prop1 prop3 prop2
    prop2 prop1 prop3
    prop2 prop3 prop1
    prop3 prop1 prop2
    prop3 prop2 prop1

    Mais bon, c'est un peu barbare comme méthode ...

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 091
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 091
    Points : 8 194
    Points
    8 194
    Billets dans le blog
    17
    Par défaut
    DOM propose une méthode loadHTML http://fr.php.net/manual/fr/domdocument.loadhtml.php
    Si le HTML est mal formé et impossible à traiter tu peux le passer à la moulinette Tidy auparavant http://fr.php.net/tidy
    Ensuite avec DOM tu pourras faire un XPath et extraire les attributs t'intéressant http://fr.php.net/manual/fr/class.domxpath.php
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par Séb. Voir le message
    DOM propose une méthode loadHTML http://fr.php.net/manual/fr/domdocument.loadhtml.php
    Si le HTML est mal formé et impossible à traiter tu peux le passer à la moulinette Tidy auparavant http://fr.php.net/tidy
    Ensuite avec DOM tu pourras faire un XPath et extraire les attributs t'intéressant http://fr.php.net/manual/fr/class.domxpath.php
    Apparemment Tidy ne replace pas l'ordre des propriétés des balises links.

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 091
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 091
    Points : 8 194
    Points
    8 194
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Khleo Voir le message
    Apparemment Tidy ne replace pas l'ordre des propriétés des balises links.
    Ce n'est pas son rôle. Son rôle est de réparer un document HTML. Cela nous intéresse pour le rendre exploitable par DOM et récupérer les attributs de <link>.
    A savoir qu'en HTML les attributs d'une balise n'ont pas d'ordre à proprement parler.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    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
     
    // Recherche dans la chaine "$str" les attributs dont les noms sont dans le tableau "$attrs".
    function get_Attributs($attrs,$str){
    	$tab=array();
    	foreach($attrs as $attr){
    		$s=preg_quote($attr,'/');
    		if(preg_match('/(?<=<balise\s).*?'.$s.'\s*=\s*"([^"]*)"[^>]*>/si',$str,$res))$tab[$attr]=$res[1];
    	}
    	return (count($tab)==count($attrs))?$tab:false;
    }
     
    $s ='<balise prop3="aaa" prop1="bbb" prop2="ccc" />';
     
    $attrs=array('prop1','prop2','prop3');
     
    $tab=get_Attributs($attrs,$s);
    if($tab!==false){
    	echo "<pre>\n"; print_r($tab); echo "</pre>\n";
    }

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par Eric2a Voir le message
    Salut,

    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
     
    // Recherche dans la chaine "$str" les attributs dont les noms sont dans le tableau "$attrs".
    function get_Attributs($attrs,$str){
    	$tab=array();
    	foreach($attrs as $attr){
    		$s=preg_quote($attr,'/');
    		if(preg_match('/(?<=<balise\s).*?'.$s.'\s*=\s*"([^"]*)"[^>]*>/si',$str,$res))$tab[$attr]=$res[1];
    	}
    	return (count($tab)==count($attrs))?$tab:false;
    }
     
    $s ='<balise prop3="aaa" prop1="bbb" prop2="ccc" />';
     
    $attrs=array('prop1','prop2','prop3');
     
    $tab=get_Attributs($attrs,$s);
    if($tab!==false){
    	echo "<pre>\n"; print_r($tab); echo "</pre>\n";
    }
    Merci beaucoup, ce script fonctionne très bien !

    Avant de publier ma fonction, je voudrais savoir si il existe un moyen de récupérer les link qui se trouvent cote à cote :

    <link blabla ><link blabla >
    car pour le moment il détecte uniquement les :

    <link blabla >
    <link blabla >
    Pour sortir les links, j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/<link(.*)>/im', $html, $matches, PREG_SET_ORDER);
    .

    De plus, est t'il possible d'adapter le code :

    Actuellement il extrait les :

    <link prop = "valeur" >
    Est-il possible d'extraire également les :

    <link prop = 'valeur' >
    Merci

  9. #9
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Re,

    Pour prendre aussi en compte les apostrophes :

    Sinon, j'ai fait un code qui recherche toutes les balises <link />, liste les attributs/valeurs trouvés et... manquants.

    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
    // Balises
    $html ='<link rel=\'stylesheet\''."\n".' type="text/css" media="screen" href="/screen.css" />'."\n";
    $html.='<link rel=\'alternate\' type="application/rss+xml" title="RSS" href="/rss.xml" />'."\n";
    $html.='<link href="/rss.xml" />'."\n";
    $html.='<link rel=\'icon\' href="/favicon.ico" type="image/x-icon" />'."\n";
     
    // Attributs obligatoires
    $attrs=array('rel','href');
     
    // Recherche les balises <link />
    if(@preg_match_all('%(?<=link)\s+((?:[^<>=\r\n]+\s*=\s*(?:"[^<>"]*"|\'[^<>\']*\')\s*)+)/?(?=>)%i',$html,$matches,PREG_PATTERN_ORDER)){
    	echo "<ol>\n";
    	foreach($matches[1] as $s){
    		$s=preg_replace('/\r?\n/',' ',trim($s));
    		echo "\t<li><strong>".$s."</strong>\n\t\t<ul>\n";
    		// Liste les couples "attribut=valeur"
    		if(@preg_match_all('/([^\s]+)\s*=\s*("[^"]*"|\'[^\']*\')/',$s,$res,PREG_SET_ORDER)){
    			$attrsfound=array();
    			foreach($res as $tab){
    				$attribut=$tab[1];
    				$value=$tab[2];
    				if((in_array($attribut,$attrs,true))and(!isset($attrsfound[$attribut])))$attrsfound[$attribut]=$attribut;
    				echo "\t\t\t<li><span style=\"color:blue\">".$attribut.'</span> = <span style="color:green">'.$value."</span></li>\n";
    			}
    			// Liste les éventuels attributs obligatoires manquants
    			$ok=(count($attrsfound)==count($attrs));
    			if(!$ok){
    				echo "\t\t\t<li style=\"color:red\">Attribut(s) obligatoire(s) manquant(s)\n";
    				echo "\t\t\t\t<ul>\n";
    				foreach($attrs as $a){
    					if(!in_array($a,$attrsfound))echo "\t\t\t\t\t<li>".$a."</li>\n";
    				}
    				echo "\t\t\t\t</ul>\n\t\t\t</li>\n";
    			}
    		}
    		echo "\t\t</ul>\n\t</li>\n";
    	}
    	echo "</ol>\n";
    }
    qui renvoie
    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
    1.	rel='stylesheet' type="text/css" media="screen" href="/screen.css"
    
    	rel = 'stylesheet'
    	type = "text/css"
    	media = "screen"
    	href = "/screen.css"
    
    2.	rel='alternate' type="application/rss+xml" title="RSS" href="/rss.xml" 
    
    	rel = 'alternate'
    	type = "application/rss+xml"
    	title = "RSS"
    	href = "/rss.xml"
    
    3.	href="/rss.xml" 
    
    	href = "/rss.xml"
    
    	Attribut(s) obligatoire(s) manquant(s) 
    	
    		rel
    		
    4.	rel='icon' href="/favicon.ico" type="image/x-icon" 
    
    	rel = 'icon'
    	href = "/favicon.ico"
    	type = "image/x-icon"
    Avec ça, t'as de quoi faire

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

Discussions similaires

  1. [Débutant]Ordre des champs dans une table
    Par goony dans le forum Débuter
    Réponses: 4
    Dernier message: 16/02/2006, 12h05
  2. Ordre des Colonnes d'une requête
    Par dlh1222 dans le forum Access
    Réponses: 4
    Dernier message: 14/09/2005, 23h43
  3. Modif des attributs d'une balise <param> en javascript
    Par Henri dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/08/2005, 22h20
  4. [Portal 9iAS] : ordre des items dans une région
    Par melitta dans le forum Oracle
    Réponses: 8
    Dernier message: 21/10/2004, 14h01
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53

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