3task - PHP Online

Form of PHP Sandbox

Enter Your PHP code here for testing/debugging in the Online PHP Sandbox. As in the usual PHP files, you can also add HTML, but do not forget to add the tag <?php in the places where the PHP script should be executed.



Your result can be seen below.

Result of php executing





Full code of 3task.php

  1. <?php
  2. //Тестирование функции на URL-адресах
  3. $str1 = "https://http.google.com:456789/folder//././?var1=val1&var2=val2&var1=qwe?qwe&var2=val456&var3=var495159";
  4. $str2 = "https://http.google.com/folder//././?var1=val1&var2=val2";
  5.  
  6. //Тестирование функции на URL-адресах
  7. $str3 = "ftp://mail.ru/?hello=world&url=https://http.google.com/folder//././?var1=val1&var2=val2";
  8. $str4 = "mail.ru/?hello=world&url=https://http.google.com/folder//././?var1=val1&var2=val2";
  9. $str5 = "index.html?mail=ru";
  10.  
  11. //Тестирование функции на URL-адресах
  12. $str6 = "domain2.zone:8080/folder/subfolder/../././../asdss/.././//////../myfolder/" 
  13. ."script.php?var1=val1&var2=val2";
  14. $str7 = "http://dom.dom.domain2.com:8080/folder/subfolder/./myfolder/script.php"
  15. ."?var1=val1&var2=val2?var1=val1&var2=val2";
  16.  
  17. //Вывод результатов для примера 1
  18. $result1 = myurlparse($str1);
  19. var_dump($result1);
  20. echo '<br />';
  21.  
  22. //Вывод результатов для примера 2
  23. $result2 = myurlparse($str2);
  24. var_dump($result2);
  25. echo '<br />';
  26.  
  27. //Вывод результатов для примера 3
  28. $result3 = myurlparse($str3);
  29. var_dump($result3);
  30. echo '<br />';
  31.  
  32. //Вывод результатов для примера 4
  33. $result4 = myurlparse($str4);
  34. var_dump($result4);
  35. echo '<br />';
  36.  
  37. //Вывод результатов для примера 5
  38. $result5 = myurlparse($str5);
  39. var_dump($result5);
  40. echo '<br />';
  41.  
  42. //Вывод результатов для примера 6
  43. $result6 = myurlparse($str6);
  44. var_dump($result6);
  45. echo '<br />';
  46.  
  47. //Вывод результатов для примера 7
  48. $result7 = myurlparse($str7);
  49. var_dump($result7);
  50.  
  51.  
  52. function  myurlparse(string $__urlAdress)
  53. {
  54.     $arrayUrl = array(
  55.         'protocol'       => false, 
  56.         'domain'         => false, 
  57.         '2_level_domain' => false, 
  58.         'zone'           => false, 
  59.         'port'           => false, 
  60.         'rawFolder'      => false, 
  61.         'folder'         => false, 
  62.         'scriptPath'     => false, 
  63.         'scriptName'     => false, 
  64.         'isPHP'          => false, 
  65.         'isError'        => false,
  66.         'parameters'     => array()
  67.     );
  68.     
  69.     //Деление исходной строки на подсроки с параметрами и без
  70.     $parameters             = mb_substr($__urlAdress, mb_strpos($__urlAdress,"?") + 1);
  71.     $parameters            .= "&";
  72.     $withoutParameters      = strtok($__urlAdress,"?");
  73.     
  74.     // Поиск параметров
  75.     $parametersArray = array();
  76.     while (strtok($parameters,"&") !== false) {
  77.         
  78.         //Вырезаем название параметра
  79.         $parameter   = strtok($parameters, "=");
  80.         $parameters = mb_substr($parameters, mb_strlen($parameter) + 1);
  81.         
  82.         //Вырезаем значение параметра
  83.         $parameterValue              = strtok($parameters, "&");
  84.         $parameters                  = mb_substr($parameters, mb_strlen($parameterValue) + 1);
  85.         $parametersArray[$parameter] = $parameterValue;
  86.     }
  87.     
  88.     //Присваивание параметров
  89.     $arrayUrl['parameters'] = $parametersArray;
  90.     
  91.     //Поиск протокола
  92.     if (strtok($withoutParameters,"/") === strtok($withoutParameters,":").":"){
  93.         $arrayUrl['protocol'] = strtok($withoutParameters,"://");
  94.     }
  95.     else{
  96.         
  97.         //Присваивание ложного значения, при отсутствии протокола
  98.         $arrayUrl['protocol'] = false;
  99.     }
  100.     
  101.     //Взятие построки без протокола
  102.     if ($arrayUrl['protocol']){
  103.         $withoutParametersProtocol = mb_substr($withoutParameters, mb_strlen($arrayUrl['protocol'])+3);
  104.     }
  105.     else{
  106.         
  107.         //При ложном значении строка не изменяется
  108.         $withoutParametersProtocol = $withoutParameters;
  109.     }
  110.     
  111.     //Переворачивание строки (без Параметров и Протокола)
  112.     $reverseWithoutParametersProtocol = strrev($withoutParametersProtocol);
  113.     $reverseWithoutParametersProtocol .= "/";
  114.     
  115.     //Поиск скрипта
  116.     $scriptName  = strrev(mb_substr($reverseWithoutParametersProtocol, 0, mb_strpos($reverseWithoutParametersProtocol, "/")));
  117.     if (strrev(mb_substr($reverseWithoutParametersProtocol, 0, mb_strpos($reverseWithoutParametersProtocol, "/"))) == "" && $arrayUrl['parameters'] !== ""){
  118.         
  119.         //При отсутствии оригинального скрипта 
  120.         $arrayUrl['scriptName'] = "index.php";
  121.     }
  122.     else{
  123.         
  124.         //При наличии оригинального скрипта
  125.         $arrayUrl['scriptName'] = strrev(mb_substr($reverseWithoutParametersProtocol, 0, mb_strpos($reverseWithoutParametersProtocol, "/")));
  126.     }
  127.     
  128.     //Проверка типа скрипта
  129.     if(strtok(strrev($arrayUrl['scriptName']),".") !== "php"){
  130.         
  131.         //Если он не типа php
  132.         $arrayUrl['isPHP'] = false;
  133.     }
  134.     else{
  135.         
  136.         //Если он типа php
  137.         $arrayUrl['isPHP'] = true;
  138.     }
  139.     
  140.     //Строка без "/";
  141.     $reverseWithoutParametersProtocol = strrev($withoutParametersProtocol);
  142.     
  143.     //Путь к скрипту
  144.     $rawFolder = strrev(mb_substr($reverseWithoutParametersProtocol, mb_strlen($scriptName)));
  145.     
  146.     //При отсутствии протокола возврат относительного пути
  147.     if ($arrayUrl['protocol'] === false) {
  148.         if ($rawFolder == ""){
  149.             
  150.             //При отсутвии пути к скрипту присваиваем ложное значение
  151.             $arrayUrl['rawFolder'] = false;
  152.         }
  153.         else{
  154.             
  155.             //При наличии пути присваиваем его
  156.             $arrayUrl['rawFolder'] = $rawFolder;
  157.         }
  158.         
  159.         //Присвоение действительного значения пути к файлу
  160.         $arrayUrl['folder']     = pruningAddress($arrayUrl['rawFolder']);
  161.         
  162.         //Присвоение скрипта
  163.         $arrayUrl['scriptPath'] = $arrayUrl['folder'].$arrayUrl['scriptName'];
  164.         
  165.         //выход из функции и возврат относительного пути
  166.         return $arrayUrl;
  167.     }
  168.     
  169.     //В случае наличия протокола, разбираем адрес до скрипта
  170.     $arrayUrl['domain']     = strtok($withoutParametersProtocol,":/");
  171.     $reverseDomain          = strrev($arrayUrl['domain']);
  172.     
  173.     //Присвоение зоны домена и основного домена
  174.     $arrayUrl['zone']       = strrev(strtok($reverseDomain,"."));
  175.     $arrayUrl['2_level_domain'] = strrev(strtok(substr($reverseDomain, mb_strlen($arrayUrl['zone']) + 1),"."));
  176.     
  177.     //Присвоение порта
  178.     if (mb_strpos($withoutParametersProtocol, ":") === false){
  179.         
  180.         //Если порт отсутствует
  181.         $arrayUrl['port'] = 80;
  182.     }
  183.     else{
  184.         
  185.         //Если порт присутствует
  186.         $arrayUrl['port'] = strtok(substr($withoutParametersProtocol, mb_strlen($arrayUrl['domain']) + 1), "/"); 
  187.     }
  188.     
  189.     //Счётчик количества флагов
  190.     $subDomain = 0;
  191.     while (strpos($arrayUrl['domain'], ".") !== false) {
  192.         
  193.         //подсчёт количества поддоменов
  194.         $subDomain++;
  195.         $arrayUrl['domain'] = mb_substr($arrayUrl['domain'], strpos($arrayUrl['domain'], ".") + 1);
  196.     }
  197.     
  198.     //Присваиваем флагу значение
  199.     if ($subDomain > 6){
  200.         //При количестве поддоменов 7 и более
  201.         $arrayUrl['isError'] = true;
  202.     }
  203.     else{
  204.         //При количестве поддоменов 6 и менее
  205.         $arrayUrl['isError'] = false;
  206.     }
  207.     
  208.     //Взятие подстроки пути к скрипту
  209.     if (mb_strpos($withoutParametersProtocol, ":") !== false){
  210.         
  211.         //Если порт присутсвует
  212.         $folder = mb_substr($rawFolder, mb_strlen($arrayUrl['domain']) + mb_strlen($arrayUrl['port']) + 2);
  213.     }
  214.     else{
  215.         
  216.         //Если порт отсутствует
  217.         $folder = mb_substr($rawFolder, mb_strlen($arrayUrl['domain']) + 1);
  218.     }
  219.     
  220.     //Разбираем пути к скрипту
  221.     $arrayUrl['rawFolder']  = $folder;
  222.     $arrayUrl['folder']     = pruningAddress($arrayUrl['rawFolder']);
  223.     $arrayUrl['scriptPath'] = $arrayUrl['folder'].$arrayUrl['scriptName'];
  224.     return $arrayUrl;
  225. }
  226.  
  227. /**
  228.  * Парсит адрес до скрипта
  229.  * 
  230.  * @param string $__address Изначальный адрес.
  231.  * 
  232.  * @return string
  233.  */
  234. function pruningAddress(string $__address)
  235. {
  236.     //Создание перенной и массива из переменных для прохода по адресу
  237.     $bufferArray = array();
  238.     $buffer      = strtok($__address, "/");
  239.     
  240.     //Проход по адресу и его сокращение
  241.     while ($buffer !== false) {
  242.         if ($buffer !== ".." && $buffer !== ".") {
  243.             $bufferArray[] = $buffer;
  244.         }
  245.         
  246.         //При нахождении ".." извлекаем последний элемент массива
  247.         if ($buffer === "..") {
  248.             array_pop($bufferArray);
  249.         }
  250.         
  251.         //Записываем новую папку и сокращаем адрес
  252.         $__address   = mb_substr($__address, mb_strlen($buffer) + 1);
  253.         $buffer = strtok($__address, "/");
  254.     }
  255.     
  256.     //Присваивание действительного пути к файлу
  257.     if (implode("/", $bufferArray) === ""){
  258.         //при отсутствии
  259.         $arrayUrl['folder'] = false;
  260.     }
  261.     else{
  262.         //при наличии
  263.         $arrayUrl['folder']  = implode("/", $bufferArray);
  264.         $arrayUrl['folder'] .= "/";
  265.     }
  266. }