62 votes

Utilisation de PHP pour remplacer les espaces dans les URL par %20

Je cherche à remplacer toutes les occurrences d'espaces dans les urls par %20. Comment puis-je le faire avec une expression rationnelle ?

Merci !

95voto

Pascal MARTIN Points 195780

Pas besoin d'une regex ici, si vous voulez simplement remplacer un morceau de chaîne par un autre : en utilisant str_replace() devrait être plus que suffisant :

$new = str_replace(' ', '%20', $your_string);

Mais, si vous voulez un peu plus que cela, et c'est probablement le cas, si vous travaillez avec des URL, vous devriez jeter un coup d'œil à l'outil urlencode() fonction.

39voto

Second Rikudo Points 59550

Utilisez urlencode() plutôt que d'essayer de mettre en œuvre la vôtre. Soyez paresseux.

35voto

drosanda Points 471

Je pense que vous devez utiliser rawurlencode() au lieu de urlencode() pour votre objectif.

échantillon

$image = 'some images.jpg';
$url   = 'http://example.com/'

Avec urlencode($str), le résultat sera le suivant

echo $url.urlencode($image); //http://example.com/some+images.jpg

il ne passe pas du tout à %20

mais avec rawurlencode($image) produira

echo $url.rawurlencode(basename($image)); //http://example.com/some%20images.jpg

16voto

Vyktor Points 10531

Vous avez plusieurs options pour le faire :

  • urlencode() o rawurlencode() - fonctions conçues pour encoder les URL pour le protocole http
  • str_replace() - remplacer la chaîne "machines lourdes" par
  • strtr() - aurait de meilleures performances que str_replace() lors du remplacement de plusieurs caractères
  • preg_replace() utiliser des expressions régulières (compatible perl)

strtr()

En supposant que vous voulez remplacer "\t" y " " con "%20" :

$replace_pairs = array(
  "\t" => '%20',
  " " => '%20',
);
return strtr( $text, $replace_pairs)

preg_replace()

Vous avez peu d'options ici, soit remplacer juste l'espace ~ ~ en remplaçant à nouveau l'espace et la tabulation ~[ \t]~ ou tous types d'espaces ~\s~ :

return preg_replace( '~\s~', '%20', $text);

Ou lorsque vous devez remplacer une chaîne de caractères comme ceci "\t \t \t \t" avec un seul %20 :

return preg_replace( '~\s+~', '%20', $text);

J'ai supposé que vous souhaitiez réellement utiliser le remplacement manuel des chaînes de caractères et gérer d'autres types d'espaces comme les espaces insécables ( <code>&nbsp;</code> )

1voto

Jonatas Walker Points 7791
    public static function normalizeUrl(string $url) {
        $parts = parse_url($url);
        return $parts['scheme'] .
            '://' .
            $parts['host'] .
            implode('/', array_map('rawurlencode', explode('/', $parts['path'])));

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X