2
votes

Obtenir des variables entre les barres obliques dans une URL

Disons que j'ai une URL: https://somesite.com/0/posts/20/290/755653-Title.html Comment obtenir ces variables: / 0 /, / 20 /, / 290 / ? Notez que ce sont des variables, elles seront toujours différentes.

Je pensais pouvoir les obtenir comme ceci:

$ url = '//somesite.com/0/posts/20/290/755653-Title.html'; var_dump (parse_url ($ url));

mais le tableau ne les affiche pas comme des variables séparées. Doit-il être fait avec un preg_replace à la place? Je ne pense pas savoir comment. Merci pour votre aide.


1 commentaires

Via .htaccess ?


3 Réponses :


1
votes

Vous pouvez utiliser explode () et transformer la chaîne en un tableau divisé par le délimiteur "/".

https:

somesite.com
0
posts
20
290
755653-Title.html

Sortie:

https:

somesite.com
0
posts
20
20
290
755653-Title.html
<?php
// Example 1
$url  = "https://somesite.com/0/posts/20/290/755653-Title.html";
$pieces = explode("/", $url);
echo $pieces[0] . "<br />";
echo $pieces[1] . "<br />";
echo $pieces[2] . "<br />";
echo $pieces[3] . "<br />";
echo $pieces[4] . "<br />";
echo $pieces[5] . "<br />";
echo $pieces[5] . "<br />";
echo $pieces[6] . "<br />";
echo $pieces[7] . "<br />";

echo "<hr />";
// Example 2
$data = "https://somesite.com/0/posts/20/290/755653-Title.html";
list($first, $second, $third, $fourth, $fifth, $sixth, $seventh, $eighth) = explode("/", $url);
echo $first . "<br />";
echo $second . "<br />";
echo $third . "<br />";
echo $fourth . "<br />";
echo $fifth . "<br />";
echo $sixth . "<br />";
echo $seventh . "<br />";
echo $eighth . "<br />";

?>


2 commentaires

J'aime cela! C'est ce que je voulais, en fait. J'essaierai tous. Je suis passé de ne pas avoir d'options à trop! :)


Notez que cela ne répond pas réellement à la question initiale.



2
votes

Une option consiste à utiliser une anticipation positive avec preg_match_all où vous capturez le motif dans un groupe de capture:

(?=/(\d+)/) 

Cela correspondra

  • (? = Lookahead positif, affirmer que ce qui se trouve directement à droite est
    • (/ \ d + /) Match / , 1+ chiffres et /
  • ) Fermer la recherche positive

Démo Regex | Démo Php

Par exemple

Array
(
    [0] => /0/
    [1] => /20/
    [2] => /290/
)
Résultat
$re = '~(?=(/\d+/))~m';
$str = 'https://somesite.com/0/posts/20/290/755653-Title.html';

preg_match_all($re, $str, $matches);
print_r($matches[1]);

Si vous souhaitez obtenir les chiffres uniquement sans les barres obliques, vous pouvez ajouter le groupe autour des chiffres uniquement

(?=(/\d+/))


5 commentaires

Impressionnant. Encore une question, comment pourrais-je les faire écho / les obtenir séparément? Que, par exemple, / 20 / sera dans ce tableau?


Voulez-vous dire que vous voulez / , 0 et / séparément dans un tableau?


Non, je veux dire que je veux les utiliser comme $ a, $ b, $ c. Mais je ne sais pas comment les extraire du tableau et les utiliser séparément si nécessaire.


@VitaliKloster Vous pouvez accéder aux valeurs par index comme $ a = $ matches [1] [0]; et $ b = $ matches [1] [1];


Beau. Je vous remercie.



1
votes

Nous pouvons essayer de diviser sur le séparateur de chemin, puis d'utiliser array_filter avec une fonction en ligne pour ne conserver que les composants purement numériques:

Array
(
    [3] => 0
    [5] => 20
    [6] => 290
)

Ceci imprime: p >

$str = 'https://somesite.com/0/posts/20/290/755653-Title.html';
$parts = explode("/", $str);
$parts = array_filter($parts, function($item) { return is_numeric($item); });
print_r($parts);

Notez que cette approche évite complètement l'utilisation d'une expression régulière formelle, ce qui pourrait avoir des implications sur les performances si vous deviez le faire souvent dans votre script.


0 commentaires