В смисъл, функция, която да разделя URL на компоненти, относително коректен и да прави разделянето с едно минаване през стринга с URL? Или ако щете със сложност O(n).
Относително коректен означава, ако има на входа валидно URL, да го разделя коректно. Ако има невалидно URL, може да го разделя некоректно, но трябва да детектира, че URL-то е невалидно.
Всички елементи в URL-то може и да ги няма.
waldorf
Създадено на 03.07.2023, видяно: 431 пъти. #93649
Пробвал ли си там с разните му генератори на парсери по граматики които генерират крайни автомати?
Не. Не съм чак толкова добър програмист. Аз си ги пиша ръчно тия работи. Но тук даже не съм сигурен, че такова решение съществува...
Stilgar
Създадено на 03.07.2023, видяно: 416 пъти. #93652
O(N) със сигурност защото различните части на URL-то са константа и може да си ги събереш с един pass и после да пробваш различни неща върху списъка от части, single pass не знам...
Парсер генераторите са вуду магии с дошли от праисторически митичнии програмисти които отдавна не живеят по нашите земи. Едва ли и чак толкова добрите програмисти които редовно ги ползват са наясно как точно работят затова може смело да ги погледнеш.
Там според разните му теории ако не бъркам имаше значение дали са с лява или дясна рекурсия за да може да се изгенерира краен автомат. Ако може то тогава със сигурност сложността ще е линейна и най вероятно ще може да е еднопасово. Само не знам дали няма да иска предварителен пас за да разбие всичко на токени - но то това е заобиколимо. Иска четене ...
/path/path/file.txt просто абсолютен път на текущия хост (от рута)
path/path/file.txt относителен път на текущия хост, спрямо текущия път.
host/path/file.txt абсолютен път на хоста "host"
https://host/path/file.txt първото след схемата е хоста? Или след двойния слеш?
user@host/path/file.txt първото след юзера е хоста? Или не?
google.com?q=something@myhost/path/ тук хоста е myhost, а не google.com
Реално в момента ми е трудно да предположа как да се различи вторият от третият пример? Или да се промени начина на запис, така че да са различими...
/path/path/file.txt просто абсолютен път на текущия хост (от рута)
path/path/file.txt относителен път на текущия хост, спрямо текущия път.
host/path/file.txt абсолютен път на хоста "host"
https://host/path/file.txt първото след схемата е хоста? Или след двойния слеш?
user@host/path/file.txt първото след юзера е хоста? Или не?
google.com?q=something@myhost/path/ тук хоста е myhost, а не google.com
Реално в момента ми е трудно да предположа как да се различи вторият от третият пример? Или да се промени начина на запис, така че да са различими...
Някакви идеи-коментари?
Ти всички възможни видове урл-та на света ли искаш да парсваш или ще се ограничиш до някое подмножество? :) Конкретно в HTTP протокола, хоста не е опционален елемент и първите ти два примера не са валидни урл-та. Спецификацията я има тук: https://datatracker.ietf.org/doc/html/rfc1738
Преди много време правих собствено рутиране, като държах съдържанието на файловете в паметта. Това с nginx, и поддомейните ми бяха като контролери (от схемата MVC). Но до колкото си спомням ползвах някакво (С) апи преди фцги интерфейса. Трябва да погледна. Сайта беше на С++.
Едит:
libfcgi.a е библиотеката.
Stilgar
Създадено на 04.07.2023, видяно: 321 пъти. #93673
Добре, конкретен въпрос. По какво се отличава хоста от пътя?
Ясно, че ако има порт, то това преди него е хост. А ако няма изрично споменат порт?
/path/path/file.txt просто абсолютен път на текущия хост (от рута)
path/path/file.txt относителен път на текущия хост, спрямо текущия път.
host/path/file.txt абсолютен път на хоста "host"
https://host/path/file.txt първото след схемата е хоста? Или след двойния слеш?
user@host/path/file.txt първото след юзера е хоста? Или не?
google.com?q=something@myhost/path/ тук хоста е myhost, а не google.com
Реално в момента ми е трудно да предположа как да се различи вторият от третият пример? Или да се промени начина на запис, така че да са различими...
Някакви идеи-коментари?
Малко ми се чини че са неразличими тея. Може би host може да кажеш, че следва да е нещо с точка в него или localhost и така да го разпознаваш
Ти всички възможни видове урл-та на света ли искаш да парсваш или ще се ограничиш до някое подмножество? :) Конкретно в HTTP протокола, хоста не е опционален елемент и първите ти два примера не са валидни урл-та. Спецификацията я има тук: https://datatracker.ietf.org/doc/html/rfc1738
Ами те всички URL-та са по една схема. Ако работи с едните, трябва да работи със всички. В HTTP протокола, хоста е опционален. Ето ти една връзка без хост: /wazmovno-li-e-da-se-napishe-ednopasow-url-spliter.7946 която си работи съвсем даже добре.
Спецификацията я четох и пак ще я чета, но нещо много объркана ми се струва и не съм сигурен, че се спазва особено точно. Порових малко из нета и се оказва, че има няколко варианта на библиотеки за сплитване на URL-та които не работят еднакво...
Stilgar
Създадено на 04.07.2023, видяно: 285 пъти. #93684
Важното е че ще отидат 5 дена за нещо дето се прави за 2 мин
Може, но парсера на джони ще е средно с 5 милисекунди по-бърз от готовата библиотека и тия 5 дни загубени ще се избият за нула време.
И като казваш "милисекунди" сигурно имаш предвид наносекунди и то ако URL-то е поне 3000 символа
Stilgar
Създадено на 04.07.2023, видяно: 284 пъти. #93685
Ти всички възможни видове урл-та на света ли искаш да парсваш или ще се ограничиш до някое подмножество? :) Конкретно в HTTP протокола, хоста не е опционален елемент и първите ти два примера не са валидни урл-та. Спецификацията я има тук: https://datatracker.ietf.org/doc/html/rfc1738
Ами те всички URL-та са по една схема. Ако работи с едните, трябва да работи със всички. В HTTP протокола, хоста е опционален. Ето ти една връзка без хост: /wazmovno-li-e-da-se-napishe-ednopasow-url-spliter.7946 която си работи съвсем даже добре.
Спецификацията я четох и пак ще я чета, но нещо много объркана ми се струва и не съм сигурен, че се спазва особено точно. Порових малко из нета и се оказва, че има няколко варианта на библиотеки за сплитване на URL-та които не работят еднакво...