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 :

Séparateur conditionné d'un explode [RegEx]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Séparateur conditionné d'un explode
    Bonjour,
    Je suis à la fin d'une formation de développeur logiciel AFPA qui se termine par un stage et je suis confronté à une grosse difficulté.

    Voilà par exemple la chaîne de caratère suivante :
    "Consultant Conduite du changement / Organisation (Management / Métier)Consultant fonctionnel / MOA (Management / Métier)"

    Je voudrais pouvoir la segmenter de cette façon :
    Consultant Conduite du changement
    Organisation (Management / Métier)
    Consultant fonctionnel
    MOA (Management / Métier)

    Il faudrait donc la délimiter à partir des slashs sauf quand ces derniers se trouvent dans des parenthèses et aussi à partir de la première parenthèse fermante.

    Mais j'essaye déjà de me concentrer sur le problème des slashs que je veux garder dans les parenthèses.

    J'ai déjà codé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $string = 'Consultant Conduite du changement / Organisation (Management / Métier)Consultant fonctionnel / MOA (Management / Métier)';
     
    $tmp=explode("/", $string);
     
    for($i=0, $max=count($tmp); $i<$max; $i++)
    	$tabMetiers[]=trim($tmp[$i]);
     
    var_dump($tabMetiers);
    Evidemment, ça segmente à partir de tous les slashs y compris ceux entre parenthèses.

    Alors, j'ai essayé d'isoler les expressions qui contiennent des parenthèses avec à l'intérieur des slashs mais sans grand succès.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $string = 'Consultant Conduite du changement / Organisation (Management / Métier)Consultant fonctionnel / MOA (Management / Métier)';
     
    preg_match('%.*\((.*?)\).*%Ui', $string, $matches);
    var_dump($matches);
    Est-ce que quelqu'un aurait une bonne idée pour résoudre ce problème?
    Merci d'avance, Seb.

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    tu dois pouvoir faire ça avec des assertions mais c'est un peu complexe voilà une solution lazy qui peut dépanner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $string = preg_replace('%(\(.*?)(/)(.*?\))%', '$1|$3', $string);
    $data = explode('/', $string);
    $data = str_replace('|', '/', $data);

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Super, ça marche

    Tu m'as fais avancé dans ce problème mais il reste une dernière difficulté.
    C'est que je ne sais pas à l'avance à combien de slashs et de série de parenthèses je vais être confronté. Dans mon exemple, tu as segmenté la chaîne en 3 mais ça pourrait être un, deux, quatre, cinq.
    En effet, j'ai oublié de préciser que je dois examiner des centaines de chaine de caractères du même ordre et issues d'un tableau.

    On peut donc avoir :
    Ingénieur Systèmes / Réseaux / Sécurité (Systèmes / Réseaux / Sécurité)
    ou bien,
    Technicien Systèmes / Réseaux (Systèmes / Réseaux / Sécurité)Autre Maintenance / HelpDesk / Bureautique (Maintenance / HelpDesk / Bureautique)Technicien HelpDesk / Support de proximité (Maintenance / HelpDesk / Bureautique)

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Si quelqu'un à la soluce via REGEX ça m'intéresse aussi
    Sinon voilà une soluce à l'ancienne qui devrait gérer tous les cas de figure je pense, mais il faut absolument qu'une parenthèse ouvrante soit refermée :

    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
    function alancienne($str)	{
    	$output = array();
    	$buffer = '';
    	$inPar = false;
    	for($i = 0, $c = strlen($str); $i < $c; $i++)	{
    		$char = $str[$i]; 
    		if($char == '/')	{
    			if(!$inPar)	{
    				$output[] = $buffer;
    				$buffer = '';
    			}
    			else	{
    				$buffer .= $char;
    			}
    		}
    		else	{
    			$buffer .= $char;
    			if($char == '(')	{
    				$inPar = true;
    			}
    			else if($char == ')')	{
    				$inPar = false;
    			} 
    		}
    	}
    	$output[] = $buffer;
    	return $output;
    }

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 910
    Points : 6 703
    Points
    6 703
    Par défaut
    Pour une solution regex, on peut par exemple utiliser preg_split():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $string = 'Technicien Systèmes / Réseaux (Systèmes / Réseaux / Sécurité)Autre Maintenance / HelpDesk / Bureautique (Maintenance / HelpDesk / Bureautique)'
            . 'Technicien HelpDesk / Support de proximité (Maintenance / HelpDesk / Bureautique)';
    $result = preg_split('~(?:\(.*?\)\K|\s*/)\s*~', $string, null, PREG_SPLIT_NO_EMPTY);
    print_r($result);

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Super le preg_split, il convient parfaitement à tous les cas de figure, fallait trouver. Merci à tous

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

Discussions similaires

  1. Fonction explode() et séparateur
    Par Katachana dans le forum Langage
    Réponses: 4
    Dernier message: 25/02/2008, 12h37
  2. [Explode] Présence aléatoire du séparateur
    Par sylk974 dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2005, 17h50
  3. [Kylix] Probleme de séparateur avec Kylix2 ?
    Par jeanphy dans le forum EDI
    Réponses: 4
    Dernier message: 10/02/2003, 16h41
  4. equivalent à explode?
    Par djridou dans le forum Langage
    Réponses: 3
    Dernier message: 28/08/2002, 11h01
  5. séparateurs dans un fichier
    Par manuhard dans le forum Langage
    Réponses: 5
    Dernier message: 13/08/2002, 11h30

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