2017-10-06 5 views
2

Je veux coder une URL en PHP dans le même comportement dans Swift est ici l'exemple Swift:URL Pourcentage d'encodage que la requête en PHP comme dans Swift

let string = "http://site.se/wp-content/uploads/2015/01/Hidløgsma.jpg" 

let encodedString = string.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) 

Résultat: http://site.se/wp-content/uploads/2015/01/Hidl%25F8gsma.jpg

comment obtenir le même résultat en PHP c'est-à-dire une fonction qui code seulement la requête et renvoie le même résultat avec l'exemple de chaîne. Voici la documentation sur la fonction Swift:

func addingPercentEncoding(withAllowedCharacters allowedCharacters: CharacterSet) -> String?

chaînes d'URL entières ne peuvent pas être codés pour cent, parce que chaque URL élément spécifie un ensemble différent de caractères autorisés. Pour par exemple, le composant de requête d'une URL autorise le caractère "@", mais ce caractère doit être codé en pourcentage dans le composant de mot de passe.

Le codage UTF-8 est utilisé pour déterminer les caractères codés en pourcentage corrects . Tous les caractères des caractères autorisés en dehors de la plage ASCII 7 bits sont ignorés.

https://developer.apple.com/documentation/foundation/nsstring/1411946-addingpercentencoding

urlQueryAllowed

Le composant de requête d'une URL est le composant immédiatement après une marque d'interrogation (?). Par exemple, dans l'URL http://www.example.com/index.php?key1=value1#jumpLink, le composant de requête est key1 = valeur1.

https://developer.apple.com/documentation/foundation/nscharacterset/1416698-urlqueryallowed

+0

Vous devez analyser le chemin après le domaine, encoder chaque composant qui fait partie de la requête en utilisant 'urlencode' et reconstruire l'URL. – jeroen

+2

De préférence, vous devriez vraiment encoder ces composants individuellement lors de l'assemblage de l'URL, pas après le fait. Et si au lieu de ø vous avez un/dans votre valeur? Ensuite, il est totalement ambigu de savoir si cela devrait être codé ou non. – deceze

Répondre

1

Il est délicat:

Tout d'abord de tout ce que je suggère d'utiliser la PECL HTTP extension

En supposant que vous n'avez pas / qui doivent être encodées, vous pouvez faire ce qui suit.

<?php 

$parsed = parse_url("http://site.se/wp-content/uploads/2015/01/Hidløgsma.jpg"); //Get the URL bits 
if (isset($parsed["path"])) { 
    $parsed["path"] = implode("/", array_map('urlencode', explode("/",$parsed["path"]))); //Break the path according to slashes and encode each path bit 
} 
//If you need to do the query string then you can also do: 
if (isset($parsed["query"])) { 
    parse_str($parsed["query"],$result); //Parse and encode the string 
    $parsed["query"] = http_build_query(
     array_combine(
      array_map('urlencode', array_keys($result)), 
      array_map('urlencode', array_values($result)) 
     ) 
    ); 
} 
//Maybe more parts need encoding? 

//http_build_url needs the PECL HTTP extension 
$rebuilt = http_build_url($parsed); //Probably better to use this instead of writing your own 

Toutefois, si vous ne souhaitez pas installer une extension pour cela, alors la chose simple à faire pour remplacer http_build_url est:

$rebuilt = $parsed["scheme"] 
    ."://" 
    .(isset($parsed["user"])?$parsed["user"]:"") 
    .(isset($parsed["pass"])?":".$parsed["pass"]:"") 
    .$parsed["host"] 
    .(isset($parsed["port"])?":".$parsed["port"]:"") 
    .(isset($parsed["path"])?$parsed["path"]:"") 
    .(isset($parsed["query"])?"?".$parsed["query"]:"") 
    .(isset($parsed["fragment"])?"#".$parsed["fragment"]:""); 

print_r($rebuilt); 

démo complète à http://sandbox.onlinephpfunctions.com/code/65a3da9a92c6f55a45138c73beee7cba43bb09c3