在Url中编码只是阿拉伯语部分并非所有Url

时间:2015-08-31 08:41:24

标签: php urlencode url-encoding

我有这个链接:http://www.example.com?p=عنوانمقالاخبار

我想编码url而不会损坏它所以我需要urlencoding arabic part form url => “عنوانمقالاخبار”并非所有网址

示例:

url将在编码后变为

http://www.example.com?p=%D8%B9%D9%86%D9%88%D8%A7%D9%86%20%D9%85%D9%82%D8%A7%D9%84%20%D8%A7%D8%AE%D8%A8%D8%A7%D8%B1

不是

http%3A%2F%2Fwww.example.com%3Fp%3D%D8%B9%D9%86%D9%88%D8%A7%D9%86%20%D9%85%D9%82%D8%A7%D9%84%20%D8%A7%D8%AE%D8%A8%D8%A7%D8%B1

提示:我从我这边建立的RSS中得到了这样的链接。

另外,我不想分割网址并编码阿拉伯语部分然后再次加入。我想要所有预期网址的一般解决方案,例如www.example.com/عربي/ 123 www.example.com/123/عربي/عربي

2 个答案:

答案 0 :(得分:1)

试试这个:

$url = 'http://www.example.com?p=عنوان مقال اخبار';

$foo = preg_replace_callback(
    '/([\x{0600}-\x{06ff}]|[\x{0750}-\x{077f}]|[\x{fb50}-\x{fc3f}]|[\x{fe70}-\x{fefc}])+/Uui'
    ,(function($match) { return urlencode($match[1]); })
    ,$url
);

echo $foo;

答案 1 :(得分:1)

@ deceze的答案是最正确的答案。他暗示你......

  • 使用parse_url分隔网址。
  • /
  • 拆分路径
  • 在所有内容上致电urlencode
  • 将网址重新组合在一起。

这将确保您生成有效的网址。

但是,如果您不关心验证,可以使用以下内容:

function EncodeExistingURL($input) {

    //From: https://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
    //The percent sign is included to leave existing encoded characters intact.
    $valid  = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~!*\'();:@&=+$,/?#[]%';
    $length = strlen($input);
    for ($i = 0; $i < $length; $i++) {
        $character = $input[$i];
        $output   .= (strpos($valid, $character) === FALSE ? rawurlencode($character) : $character); 
    }
    return $output;

}