За последние 24 часа нас посетили 68025 программистов и 1648 роботов. Сейчас ищут 1058 программистов ...

Преобразовать URL

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 23 авг 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Имеется строка:

    Код (Text):
    1. https://www.somehost.com/test/index.htmlparam1=4&param2=3&param3=2&param4=1&param5=3
    Напишите функцию, которая:

    удалит параметры со значением “3”;

    отсортирует параметры по значению;

    добавит параметр url со значением из переданной ссылки без параметров (в примере: /test/index.html);

    сформирует и вернёт валидный URL на корень указанного в ссылке хоста.

    В указанном примере функцией должно быть возвращено:

    Код (Text):
    1. https://www.somehost.com/?param4=1&param3=2&param1=4&url=%2Ftest%2Findex.htm
    /////////////////////////////////////////////////////////////////////////////////////////////////////

    Нормальное ли решение или лучше использовать регулярки?

    PHP:
    1. <?php
    2.  
    3. $url = 'https://www.somehost.com/test/index.html?param1=4&param2=3&param3=2&param4=1&param5=3';
    4. $addUrl = '/test/index.html';
    5.  
    6. function shapingUrl($url, $delParam, $addUrl){
    7.     $arr = explode('&', substr(mb_stristr($url, '?'), 1));
    8.     $resultParam = [];
    9.    
    10.     foreach($arr as $k => $v) {
    11.         $param = explode('=', $v);
    12.        
    13.         if($param[1] != $delParam) {
    14.             $resultParam[$param[0]] = $param[1];
    15.         }
    16.     }
    17.    
    18.     asort($resultParam);
    19.    
    20.     $pos = strpos($url, '/', 10);
    21.    
    22.     $newStr = '';
    23.    
    24.     $newStr = http_build_query($resultParam, '', '&amp;');
    25.    
    26.     return substr($url, 0, $pos) . '/?' . $newStr . '&amp;url='.urlencode($addUrl);
    27. }
    28.  
    29. echo shapingUrl($url, 3, $addUrl);
     
  2. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    а разве нет функции которая парсит URL?
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @AlexandrS ни разу ей не пользовался
     
  4. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    PHP:
    1. <?php
    2.  
    3. $url_str = "https://www.somehost.com/test/index.html?param1=4&param2=3&param3=2&param4=1&param5=3";
    4. $query = parse_url($url_str, PHP_URL_QUERY);
    5. parse_str($query, $output);
    6.  
    7. echo "<pre>";
    8. print_r($output);
    9. echo "</pre>";
    10.  
    11. ?>
    Кроме этого у тебя URL неверный, там нужен еще знак вопроса. Ты его потерял (в самой верхней строке)
    Так что думаю ты именно этой функцией parse_url() сможешь разобрать и обратно собрать URL как тебе будет угодно :)
     
    #4 AlexandrS, 23 авг 2018
    Последнее редактирование: 23 авг 2018
    Dimon2x нравится это.
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @AlexandrS это сюда почему-то не скопипастилось
     
  6. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    что именно?
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
  9. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Так вроде и parse_str() тоже рассмотрен в том коде который я дал.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Не заметил. Действительно