#php
Как парсить подобные ссылки: пробовал с urlencode и rawurlencode, iconv - ничего не помогает
Ответы
Ответ 1
Нельзя просто взять ссылку и пропустить ее целиком через urlencode() или rawurlencode(). На выходе вы получите уже не ссылку. Для вашего случая нужно выделить из ссылке path, разбить его на составляющие, их прогнать через функцию rawurlencode() и собрать все назад. Пример: $arr = parse_url('http://synonymonline.ru/П/прекрасный'); $link = $arr['scheme'] . '://' . $arr['host'] . implode('/', array_map('rawurlencode', explode('/', $arr['path']) ) ); echo file_get_contents($link); P.S. Если у вас домен будет содержать символы отличные от латинских, то его придется переводить в формат IDNA ASCII с использованием idn_to_ascii()Ответ 2
В моём случае целевая ссылка имела вид http://some.domain.org//Uploads/images/408/А,Б%20секция%203%20этаж%204%20квcrop.jpg т.е. смесь бульдога с носорогом - и слэши лишние, и нелатиница, и пробел в форме %20 . Помогло следующее решение, по мотивам Andr'U Sender с тостера (так вышло, сначала ответил там), плюс добавил развёрнутый рабочий пример по кириллическим доменам (и др. национальным) по наводке @Visman : Код проверен под PHP 7.2: if (preg_match('#^([\w\d]+://)([^/]+)(.*)$#iu', $filenameSrc, $m)){ $filenameSrc = $m[1] . idn_to_ascii($m[2], IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46) . $m[3]; } $filenameSrc = urldecode($filenameSrc); $filenameSrc = rawurlencode($filenameSrc); $filenameSrc = str_replace(array('%3A','%2F'), array(':', '/'), $filenameSrc); Замечу, что если пытаться использовать urlencode, а не rawurlencode, то тот кодирует пробелы в "+" плюсы и ссылка открываться не желала в таком виде. А с %20 как делает rawurlencode - прокатило. Надеюсь тут тоже кому-то спасёт немного волос :)
Комментариев нет:
Отправить комментарий