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.
3 Réponses :
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 />"; ?>
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.
Une option consiste à utiliser une anticipation positive avec preg_match_all où vous capturez le motif dans un groupe de capture: Cela correspondra Par exemple (?=/(\d+)/)
(? =
Lookahead positif, affirmer que ce qui se trouve directement à droite est
(/ \ d + /)
Match /
, 1+ chiffres et /
)
Fermer la recherche positive 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+/))
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.
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.
Via
.htaccess
?