2017-10-06 7 views
2

のようにPHPでの問合せは、スウィフト例です。URLのパーセントエンコーディングは唯一私がここスウィフトで同じ動作にPHPでURLをエンコードしたいスウィフト

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

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

結果:http://site.se/wp-content/uploads/2015/01/Hidl%25F8gsma.jpg

どのようにPHPで同じ結果を得ます。つまり、クエリのみをエンコードし、サンプルの文字列で同じ結果を返します。ここでスウィフト機能についてのドキュメントは、次のとおりです。各URL コンポーネントが使用可能な文字の異なるセットを指定しているため

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

全体のURL文字列は、パーセントエンコードすることはできません。 の例の場合、URLのクエリーコンポーネントは「@」文字を許可しますが、パスワードコンポーネントでは文字をパーセントエンコードする必要があります。

正しいパーセントエンコードされた 文字を判別するために、UTF-8エンコーディングが使用されます。 7ビットの ASCII範囲外のallowedCharactersの文字は無視されます。

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

urlQueryAllowed

URLのクエリコンポーネントは、直ちに 疑問符を以下の(?)コンポーネントです。たとえば、URL http://www.example.com/index.php?key1=value1#jumpLinkでは、クエリ はkey1 = value1です。

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

+0

$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); 

フル・デモドメインの後のパスを解析し、 'urlencode'を使ってクエリの一部である各コンポーネントをエンコードし、urlを再構築します。 – jeroen

+2

URLを組み立てるときには、事実の後ではなく、実際にそれらのコンポーネントを個別にエンコードする必要があります。 øの代わりにあなたの価値があるとしたら?それで、それがコード化されるべきかどうかは全く曖昧です。 – deceze

答えて

1

それはトリッキーです:

を第一に、すべての私は、あなたが次のことを行うことができます、あなたが必要/をエンコードする必要はありませんと仮定しPECL HTTP extension

を使用することをお勧め。あなたがhttp_build_urlを交換するために行うには、このための簡単な事を拡張機能をインストールしたくない場合は

<?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 

は次のとおりです。あなたがする必要があるhttp://sandbox.onlinephpfunctions.com/code/65a3da9a92c6f55a45138c73beee7cba43bb09c3

関連する問題