8797 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai des URL de ces formes :

http://www.monsite.fr/mot/nombre1-nombre2 [MOT].php#motnombre
 http://www.monsite.fr/mot/nombre1-nombre2  [MOT].php
Avec un espace entre nombre2 et [MOT]

J'aurais souhaité récupérer 2 variables depuis ces URL :

$var1 = nombre1;
$var2 = nombre2;


J'ai tenter de faire un truc comme ça :

preg_match('#[0-9]+\-#', $myurl, $var1);
preg_match('#-+\[0-9]#', $myurl, $var2);


Avec ça, les 2 variables affichent "Array", donc j'ai pas tout compris à priori.

Pourriez-vous m'aider ?
Modifié par Nheavy (02 Jul 2012 - 10:44)
Salut,

preg_match et preg_match_all renvoient des tableau contenant les éléments a extraire précisés dans la regex (encadrés par des parenthèses).

La solution la plus logique dans ton cas est d'utiliser une règle de réécriture d'url (URL Rewriting), dans ton fichier .htaccess

Si tu ne veut/peut pas utiliser cette solution, il faut corriger les problèmes:

- Mettre des parenthèses autour de l'élément a capturer:


preg_match('#[0-9]+\-#', $myurl, $match1);



preg_match('#([0-9]+)\-#', $myurl, $match1);


- Assigner $var1 avec les résultat dans ton tableau:


$var1 = $match1[1];


- Corriger ta 2eme expression car elle est invalide

A savoir également, que les espaces dans une url, ça craint et que [0-9]+ ne cherchera pas un mot mais un entier positif ou nul
Modifié par JJK801 (30 Jun 2012 - 14:52)
Bonjour,

Merci pour ta réponse, je ne peux pas utiliser le htaccess vu que je ne souhaite obtenir ce résultat que dans certaines circonstances.

J'ai un soucis avec le Regex, il me match aussi les nombres des noms HTML de [, ] et de l'espace, c'est à dire %5B, %5D et %20.

Pourrais-tu me dire comment faire pour qu'il me match que le nombre juste avant ou juste après le tiret ?
ça me parait plus simple avec preg_replace


$arr_a_explode = preg_replace('#.*/([0-9]+)\-([0-9]+) .*#si','$1|$2',$myurl);
list($var1,$var2) = explode('|',$arr_a_explode);

echo 'nombre1 ' . $var1 . '<br>';
echo 'nombre2 ' . $var2 . '<br>';


Je n'ai pas testé mais on ne doit pas être loin.
Bon...


<?php

$url = 'http://www.monsite.fr/mot/123-456 [MOT].php#motnombre';

if (1 === preg_match('#/(\d+)-(\d+)#', $url, $result)) {

  $var1 = $result[1];
  $var2 = $result[2];

} else {

  echo 'Aucun résultat';

}

Modifié par jb_gfx (01 Jul 2012 - 15:44)
kenor a écrit :
ça me parait plus simple avec preg_replace


$arr_a_explode = preg_replace('#.*/([0-9]+)\-([0-9]+) .*#si','$1|$2',$myurl);
list($var1,$var2) = explode('|',$arr_a_explode);

echo 'nombre1 ' . $var1 . '&lt;br&gt;';
echo 'nombre2 ' . $var2 . '&lt;br&gt;';


Je n'ai pas testé mais on ne doit pas être loin.


Quel intérêt? c'est la même chose avec un explode en plus Smiley ohwell

jb_gfx a écrit :
Bon...


&lt;?php

$url = 'http://www.monsite.fr/mot/123-456 [MOT].php#motnombre';

if (1 === preg_match('#/(\d+)-(\d+)#', $url, $result)) {

  $var1 = $result[1];
  $var2 = $result[2];

} else {

  echo 'Aucun résultat';

}


La solution est là Smiley langue

Perso je n'utilise pas les expressions non POSIX, car je les trouve un peu trop indigestes (si on considére les REGEX comme digestes) ^^

@Hheavy:

\d = [0-9]
Modifié par JJK801 (01 Jul 2012 - 20:31)
Merci beaucoup à vous tous, et plus particulièrement à jb_gfx !

a écrit :
jb_gfx a écrit :
Bon...


  &lt;?php

    $url = 'http://www.monsite.fr/mot/123-456 [MOT].php#motnombre';

    if (1 === preg_match('#/(\d+)-(\d+)#', $url, $result)) {

      $var1 = $result[1];
      $var2 = $result[2];

    } else {

      echo 'Aucun résultat';

    }


Cette solution fonctionne à merveille.
Bonne continuation
JJK801 a écrit :

Quel intérêt? c'est la même chose avec un explode en plus

2 preg_match ou 1 preg_replace + 1 explode, vite choisi perso.

Enfin la solution de jb_.. clos le débat.