Expression régulière : extraire une chaine variable d'une chaine

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par evets, 4 Septembre 2012.

  1. evets
    evets WRInaute occasionnel
    Inscrit:
    16 Septembre 2004
    Messages:
    264
    J'aime reçus:
    0
    Bonjour à tous,

    Voilà 2 heures que je galère avec une expression régulière :-( J'espère trouver de l'aide ici

    C'est très simple, je cherche la forme de mon expression pour pouvoir extraire "Paris (75000)" de ma chaine "/oujhabite/Paris (75000)/toto

    A savoir que oujhabite et toto sont fixes. Ca a l'air super simple mais je ne trouve pas d'exemple me débloquant...

    Voici ma dernière tentative : ^oujhabite(*)toto$

    Merci pour votre aide
     
  2. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    13 577
    J'aime reçus:
    0
  3. evets
    evets WRInaute occasionnel
    Inscrit:
    16 Septembre 2004
    Messages:
    264
    J'aime reçus:
    0
    Merci pour ta réponse

    Malheureusement, ma patate peut se transformer en purée parfois :wink: ou en petit pomme dauphine :(

    En effet, je peux avoir :
    /oujhabite/Paris (75000)/toto
    /oujhabite/Bordeaux (33000)/toto
    /oujhabite/Saint-Jean-de-la Patate (53000)/toto

    Pour être plus précis, ma chaîne ressemble à ceci :

    <div class="month mini-day-on"><a href="http://monsite.fr/oujhabite/Paris (75000)/toto/">mapatate</a></div>

    Je crains devoir utiliser obligatoirement un bulldozer
     
  4. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    13 577
    J'aime reçus:
    0
    Non je ne pense pas a moins que l'énoncé ne soit pas bon (édit > ou incomplet).

    Avec exp reg bien lourd
    PHP:
    <span class="syntaxdefault"><?php<br />    $dataGlobal </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'<div class="month mini-day-on"><a href="http://monsite.fr/oujhabite/Paris (75000)/toto/">mapatate</a></div>'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    $data </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> ereg_replace</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"^.*oujhabite."</span><span class="syntaxkeyword">,</span><span class="syntaxstring">""</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$dataGlobal</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    $data </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> ereg_replace</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"/.*$"</span><span class="syntaxkeyword">,</span><span class="syntaxstring">""</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$data</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    echo $data</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">?></span>
    avec de la manipulation de chaines
    PHP:
    <span class="syntaxdefault"><?php    <br />    $dataGlobal </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'<div class="month mini-day-on"><a href="http://monsite.fr/oujhabite/Paris (75000)/toto/">mapatate</a></div>'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    $debut </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> stripos</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dataGlobal</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'oujhabite/'</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> 10</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxcomment">//10 -> nombre de caractère du masque de recherche<br /></span><span class="syntaxdefault">    $fin </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> stripos</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dataGlobal</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'/toto'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    $data </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> substr </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dataGlobal</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $debut</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $fin</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">$debut</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    echo $data</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">?></span>
     
  5. evets
    evets WRInaute occasionnel
    Inscrit:
    16 Septembre 2004
    Messages:
    264
    J'aime reçus:
    0
    Merci ! Tu as raison. Le strpos m'a mis sur la piste.
     
  6. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    13 577
    J'aime reçus:
    0
    autre solution avec un preg match mais il te faudra rajouter du calcul ce qui rend la solution plus bête que la précédente qui fait la même chose sans le preg_match.

    PHP:
    <span class="syntaxhtml"><span class="syntaxdefault"></span><span class="syntaxkeyword"><</span><span class="syntaxdefault">php<br />&nbsp;&nbsp;&nbsp;&nbsp;$dataGlobal&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">'<div&nbsp;class="month&nbsp;mini-day-on"><a&nbsp;href="http://monsite.fr/oujhabite/Paris&nbsp;(75000)/toto/">mapatate</a></div>'</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$expreg&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">preg_match&nbsp;</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'|oujhabite.*toto|'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$dataGlobal</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">];<br /></span><span class="syntaxdefault">&nbsp;</span></span>
    qui va te renvoyer un truc comme "oujhabite/Paris (75000)/toto" qu'il faudra nettoyer pour avoir ton résultat.
     
  7. Zecat
    Zecat WRInaute accro
    Inscrit:
    1 Mars 2005
    Messages:
    12 434
    J'aime reçus:
    0
    tu as aussi la version explode :

    Code:
    $zechaine="oujhabite/Paris (75000)/toto";
    $zetab=explode("/", $zechaine);
    $zevilleandcp=$zetab[1];
    Pas sur que ca soit le plus performant (quoique a la reflexion probablement si puisque juste un explode) mais c'est le plus court et le plus simple en terme de code :mrgreen: en tout cas juste une petite cuillère et pas un tracto pelle :wink:

    et ensuite si tu veux la ville et le cp séparés tu ajoutes dessous

    Code:
    $zetab2=explode(" (", $zevilleandcp);
    $zeville=$zetab2[0];
    $zecp=str_replace(")","",$zetab2[1];
    
     
  8. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 821
    J'aime reçus:
    0
    Euuuuhhh...

    Code:
    preg_match('#oujhabite/(.*?)/toto#',$chaine,$matches);
    (le résultat est dans $matches[1])

    Ou pour récupérer la ville et le CP séparément:
    Code:
    preg_match('#oujhabite/(.*?) \\(\\d+\\)/toto#',$chaine,$matches);
    (les deux résultats sont dans $matches[1] et $matches[2])

    Non?

    Jacques.
     
  9. Zecat
    Zecat WRInaute accro
    Inscrit:
    1 Mars 2005
    Messages:
    12 434
    J'aime reçus:
    0
    ben vi mais quand on maitrise pas les exp reg ... un explode ca se comprend de suite et se maintient facile ensuite :wink:
     
  10. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    2 807
    J'aime reçus:
    1
    Ou bien :

    Code:
    
      // On supprime le suffixe, et on pmet dans une array...
      $array_str = preg_split("#[\/]+#", preg_replace("#\/toto$#", "", $str));
    
      // ... Le résultat se trouve à la fin de l'array. ;)
      $resul = $array_str(count($array_str) - 1];
    
    
    

    J'avoue que je ne conais pas les subtilités des regexp PCRE... ;(

    Une buse, quoi.

    Bien amicalement.

    Jean François Ortolo
     
  11. evets
    evets WRInaute occasionnel
    Inscrit:
    16 Septembre 2004
    Messages:
    264
    J'aime reçus:
    0
    Merci a tous !!