У меня есть эта ссылка: http://www.example.com?p= عنوان مقال اخبار
Я хочу закодировать URL без ущерба для него, поэтому мне нужно urlencoding арабской части формы url => «عنوان مقال اخبار» НЕ все 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, НЕ созданную с моей стороны.
Кроме того, я не хочу разделять URL-адрес и кодировать арабскую часть, а затем присоединиться к ней снова. я хочу общее решение для всех ожидаемых URL, таких как www.example.com/ عربي / 123
www.example.com/123/ عربي / عربي
Попробуй это:
$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;
Ответ @ deceze — самый правильный. Он предполагал, что ты …
/
,urlencode
на все.Это позволит вам создать правильный URL.
Однако, если вы не заботитесь о проверке, будет работать что-то вроде приведенного ниже:
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;
}