Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 13.02.2020
Сообщений: 4

Обработка (парсинг) URL для формирования страницы

13.02.2020, 15:12. Показов 1012. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый!
Для формирования страницы (вывода данных из БД) сделал, чтобы ссылка разбивалась на составляющее.
Вроде работает (php7). Какие могут быть подводные камни?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$url_parsing = 'https://tetet.ru/offer_rent/auto/24b01ed8503c474a399fc9e0cf203c69/?a=1&b=2&c=3';
 
for ($i = 1; ; $i++) {
    if ($i == 1) {
    $array[$i] = str_replace("\n", "", basename($url_parsing, dirname($url_parsing).PHP_EOL).PHP_EOL);
    }else{
        $url_parsing = dirname($url_parsing) . PHP_EOL;
            if (str_replace("\n", "", basename($url_parsing, dirname($url_parsing).PHP_EOL).PHP_EOL) == ".") {
            break;
        }
        $array[$i] = str_replace("\n", "", basename($url_parsing, dirname($url_parsing).PHP_EOL).PHP_EOL);
    }
    $i_url++;
}
 
//Рекурсия
$i = 1;
$iv = $i_url;
for ($i_recursion = 1; $i_recursion <= $i_url; $i_recursion++) {
    $url_parsing_array[$i] = $array[$iv];
    $iv--;
    $i++;
}
 
echo '<pre>';
echo var_dump($url_parsing_array);
echo '</pre>';
?>
Получается такой результат:
array(6) {
[1]=>
string(6) "https:"
[2]=>
string(8) "tetet.ru"
[3]=>
string(10) "offer_rent"
[4]=>
string(4) "auto"
[5]=>
string(32) "24b01ed8503c474a399fc9e0cf203c69"
[6]=>
string(12) "?a=1&b=2&c=3"
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2020, 15:12
Ответы с готовыми решениями:

Парсинг страницы для поиска самой ранней успешной сдачи задания
Здравствуйте, помогите пожалуйста. Надо пропарсить страницу, а именно вот эту...

Парсинг запроса из URL страницы и помещение его в ассоциативный массив
Доброго времени суток. Возникла потребность получать строку запроса из URL и помещать её в ассоциативный массив, чтобы было проще по...

Чтение XML файла и его парсинг для получения всех URL
Добрый день! Из интернета получаю XML данные - &lt;response list=&quot;true&quot;&gt; - &lt;audio&gt; &lt;aid&gt;150993468&lt;/aid&gt; ...

5
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
13.02.2020, 15:55
Для разбора полного адреса есть parse_url, но для озвученной вами цели выделять протокол и хост не нужно

Добавлено через 1 минуту
Их нет в $_SERVER['REQUEST_URI'].

Обработка $_SERVER['REQUEST_URI'] выполняется парой строк, если не выделять отдельные GET-параметры (готового $_GET практически всегда достаточно).
0
0 / 0 / 0
Регистрация: 13.02.2020
Сообщений: 4
13.02.2020, 21:42  [ТС]
Так наверное лучше. Результат тот-же.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
$url_parsing = 'https://tetet.ru/offer_rent/auto/24b01ed8503c474a399fc9e0cf203c69/?a=1&b=2&c=3';
 
$i=1;
foreach (parse_url($url_parsing) as $key => $v) {
    if ($key == "path") {
        $array = explode("/", $v);
        foreach ($array as $v) {
            if ($v) {
            $url_parsing_array[$i] = $v;
            $i++;
            }
        }
    }else{
        $url_parsing_array[$i] = $v; $i++;
    }
}
unset($v, $array, $i, $key);
 
echo '<pre>';
echo var_dump($url_parsing_array);
echo '</pre>';
?>
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
13.02.2020, 22:26
Циклы не нужны. parse_url по большому счету тоже.

И нужно что-то решать со строкой параметров. Просто размещать ее в последнем элементе массива не очень разумно.

Добавлено через 16 минут
Кстати, зачем она вам целиком? И вы знаете, что она обычно доступна в $_SERVER['QUERY_STRING']?

Или цель сконструировать очередную абстракцию, а не сделать эффективный разбор в рамках конкретного языка и окружения?
0
0 / 0 / 0
Регистрация: 13.02.2020
Сообщений: 4
14.02.2020, 09:55  [ТС]
Конечно можно с помощью explode разделить или ещё как, используя разделитель "/" и отделить "хвост" используя "?" как разделитель. Но!
Пользователь может набрать всё, что угодно, а сайт должен работать корректно при любом раскладе (должны работать перенаправление и выдавать соответствующий ответ 200, 404, 301 и т.д.).
Стал экспериментировать и функция parse_url однако штука неплохая.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$url_parse = '/rent///auto///?//pukp))pup&&&&&C//////24b01ed8503c474a399fc9e0cf203c69/'; //тут сократил (не полный URL теперь-без протокола и домена)
 
$i=1;
foreach (parse_url($url_parse) as $key => $v) {
    if ($key == "path") {
        $array = explode("/", $v);
        foreach ($array as $v) {
            if ($v) {
            $url_parse_array[$i] = $v;
            $i++;
            }
        }
    }else{
        $url_parse_array[$i] = $v;
        $i++;
    }
}
 
$url_parse_array[0] = $i-1; //Добавил в [0] количество элементов, чтобы отсечь, например последний без цикла
 
unset($v, $array, $i, $key, $url_parse);
 
?>
Получаем:

array(4) {
[1]=>
string(4) "rent"
[2]=>
string(4) "auto"
[3]=>
string(56) "//pukp))pup&&&&&C//////24b01ed8503c474a399fc9e0cf203c69/"
[0]=>
int(3)
}

Если всё остальное, кроме $url_parse_array[1] и $url_parse_array[2] бред, то можно выдать ответ 404 и перенаправить на /rent/auto/, что позволит выгрузить на страницу контент для соответствующего каталога, а не пустоту или страницу 404.
Может пока не идеально, но уже решается часть задач.
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
14.02.2020, 14:43
Цитата Сообщение от smph Посмотреть сообщение
Пользователь может набрать всё, что угодно
Где? В адресной строке? Я вам говорю, что parse_url будет пытаться разбирать в том числе и то, чего у вас в принципе не должно появиться при обработке запроса, и соответственно неправильно трактовать данные или возвращать ошибку!

Цитата Сообщение от smph Посмотреть сообщение
Если всё остальное, кроме $url_parse_array[1] и $url_parse_array[2] бред, то можно выдать ответ 404 и перенаправить на /rent/auto/, что позволит выгрузить на страницу контент для соответствующего каталога, а не пустоту или страницу 404.
При перенаправлении нужно выдавать код 3хх и не слишком увлекаться этим. Опечатку или переход по адресу ранее существовавшей страницы можно корректировать перенаправлением, но на "бред" нужно реагировать адекватно - выводом страницы 404.

Все это делается более просто и логично. А для предотвращения лишних запросов к базе данных при поступлении явно некорректных адресов можно проверять адреса на соответствие допустимым форматам, в частности на наличие только допустимых символов (в этом случае возможно даже не экранировать данные при выполнении запросов на выборку искомых записей) и т.п. Во многих случаях достаточно одной такой проверки на соответствие достаточно общему, но при этом строгому формату. Ну, можно еще добавить высокоприоритетную проверку всех поступающих адресов на возможность общей коррекции при помощи перенаправления, например для избавления от множественных слэшей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2020, 14:43
Помогаю со студенческими работами здесь

Функция формирования url
Делаю тему. Такой вопрос. Создавал свои ссылки в теме. Не могу найти функцию в WP которая формирует ссылки. Так чтобы при переключении...

Для инфоблока задать URL страницы назначения
Создал инфоблок, заполнил элементами, вывел на экран: Турция, Египет, ... , ОАЭ При выборе Турции я должен попасть на...

ЧПУ или свои URL для каждой страницы
Добрый день! Делаю небольшой движок для сайта. Столкнулся с такой проблемой. Контент хранится в БД, у каждого текста свой id, при...

Делаю расширение для хрома надо получить URL открытой страницы !
Хай делаю расширение для хрома не могу получить url страницы которая открыта Прошу помощи в этом вопросе document.location.href не...

При заливке сайта на хостинг, как прописать url для каждой страницы?
Извините за наверное глупый вопрос, в универе в течении полугода изучали html и css, знаю их отлично, но мы в наших задачках всегда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru