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

WRInaute discret
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
 
WRInaute discret
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
 
WRInaute accro
evets a dit:
Je crains devoir utiliser obligatoirement un bulldozer
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>
 
WRInaute accro
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.
 
WRInaute accro
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];
 
WRInaute accro
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.
 
WRInaute accro
ben vi mais quand on maitrise pas les exp reg ... un explode ca se comprend de suite et se maintient facile ensuite :wink:
 
WRInaute accro
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
 
Discussions similaires
Haut