Question

Je l'apache de mon serveur configuré pour rediriger toutes les requêtes en index.php, afin que je puisse utiliser comme urls:

http://www.website.com/about/us

Maintenant, je dois analyser l'URL afin de déterminer si chaque voie existe et ce qu'il faut en attendre, donc je peux mettre une table de base de données pour enregistrer les routes et que mes clients peuvent modifier leurs itinéraires comme ils les aiment être . La chose est, je ne suis pas capable de faire l'analyse syntaxique jusqu'à présent.

Voici mon code:

$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
    echo 'the route doesn\'t match';
    exit();
}

Il montre toujours ce message d'écho. Qu'est-ce que je fais mal?

edit:

La raison pour laquelle j'ai besoin regex est la suivante. Imaginez que j'ai un segment url comme:

/user/yoda

Le regex ici serait utile pour analyser le premier argument comme une action ou d'une page, et la seconde comme une clé qui ne permettra un certain ensemble de caractères, comme si je veux attendre, dans ce cas, la deuxième paramenter seulement pour correspondre à « _-azAZ09 », quelque chose comme ça. En d'autres termes, l'ensemble des expressions regex me serait par rapport à la uri afin de déterminer si l'un d'entre eux correspond à la uri, et déterminer l'action à prendre de cette suite. En utilisant la fonction exploser me faire évaluer les segments uri plus tard dans le code, wich je voudrais éviter. S'il n'y a pas de match à l'uri, transmettre immediatelly la page à un 404 et un briser l'opération. Je ne sais pas si je me suis fait clair ..

Était-ce utile?

La solution

Au lieu d'utiliser des expressions régulières, pourquoi ne pas simplement diviser l'URI entrant?

$uri = 'about/us';
list($page, $action) = explode('/', $uri);

Si vous avez besoin de plus de deux, retirez simplement la liste:

$pagePath = explode('/', $uri);

Mais, si vous insister sur l'utilisation des expressions régulières, cela fera:

$regex = '#(?P<page>.*)/(?P<action>.*)#';

Cependant, il vous offre rien de spécial, sauf que les matches de $ va maintenant contenir $matches['page'] et $matches['action'] - mais si vous avez vraiment besoin, utilisez youcan list() comme indiqué ci-dessus

.
  

La fonction ferait exploser   moi évaluer les segments uri plus tard   le code, wich je voudrais éviter

Au lieu de faire en sorte que la page est valide par son jeu de caractères, pourquoi ne pas dresser une liste de pages valide table de consultation et il suffit d'utiliser la in_array de php qui est beaucoup plus rapide qu'une expression régulière? Les segments d'extraction URL dans un tableau vous permettra d'avoir des tableaux multidimensionnels validés en peu de temps.

Autres conseils

Je pense que le regex doit être entouré d'un symbole; par exemple '@(page(/<action>))@'. Voir les exemples http://php.net/preg_match

Si vous devez absolument utiliser une expression rationnelle pour une raison quelconque, essayez ceci:

$uri = 'about/us';
$regex = '~(?<path>[^/]+)/(?<action>.+)~';
var_dump($matches);

Quels sont sorties:

array(5) {
  [0]=>
  string(8) "about/us"
  ["path"]=>
  string(5) "about"
  [1]=>
  string(5) "about"
  ["action"]=>
  string(2) "us"
  [2]=>
  string(2) "us"
}

Cependant, cela ne fonctionnera que lorsque le composant de chemin ne descend d'un niveau!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top