web-dev-qa-db-fra.com

Utilisation de PHP Remplacez SPACES dans les URL par% 20

Je cherche à remplacer toutes les occurrences d'espaces dans les URL par% 20. Comment ferais-je cela avec regex?

Merci!

50
David

Pas besoin de regex ici, si vous voulez juste remplacer un morceau de chaîne par un autre: utilisez str_replace() devrait être plus que suffisant:

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


Mais si vous voulez un peu plus que cela, et vous le faites probablement, si vous travaillez avec des URL, vous devriez jeter un oeil à la urlencode() fonction.

77
Pascal MARTIN

Utilisez urlencode() plutôt que d'essayer d'implémenter les vôtres. Être fainéant.

32
Madara Uchiha

Je pense que vous devez utiliser rawurlencode () à la place, urlencode () à cette fin.

échantillon

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

Avec urlencode ($ str) résultera

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

sa pas changer à% 20 du tout

mais avec rawurlencode ($ image) produira

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

Vous avez plusieurs options pour le faire, soit:

  • urlencode() ou rawurlencode() - fonctions conçues pour coder des URL pour le protocole http
  • str_replace() - Chaîne "Machinerie lourde" remplace
  • strtr() - aurait de meilleures performances que str_replace() lors du remplacement de plusieurs caractères
  • preg_replace() utilise des expressions régulières (compatible Perl)

strtr()

En supposant que vous souhaitiez remplacer "\t" Et " " Par "%20":

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

preg_replace()

Vous avez peu d'options ici, soit remplacer simplement l'espace ~ ~, Encore une fois remplacer l'espace et l'onglet ~[ \t]~ Ou tout types d'espaces~\s~:

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

Ou lorsque vous devez remplacer une chaîne comme celle-ci "\t \t \t \t" Par un seul %20:

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

J'ai supposé que vous vouliez vraiment utiliser le remplacement manuel des chaînes et gérer plus de types d'espaces, tels que des espaces insécables ( )

14
Vyktor
    public static function normalizeUrl(string $url) {
        $parts = parse_url($url);
        return $parts['scheme'] .
            '://' .
            $parts['Host'] .
            implode('/', array_map('rawurlencode', explode('/', $parts['path'])));

    }
0
Jonatas Walker
$result = preg_replace('/ /', '%20', 'your string here');

vous pouvez également envisager d'utiliser

$result = urlencode($yourstring)

pour échapper à d'autres personnages spéciaux aussi

0
alex347