Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

Вычисление относительной гиперссылки

15.08.2011, 10:04. Показов 2229. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две переменные, в их строковых значениях записаны абсолютные урлы двух страницы одного сайта, например, "http://localhost/theoretics/types/non_scalar/list/multy_linked/graph/" и "http://localhost/theoretics/types/scalar/pointer/". Надо вычислить относительную ссылку с одной страницы на другую. В примере надо получить "../../../../scalar/pointer/". Как это сделать?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.08.2011, 10:04
Ответы с готовыми решениями:

Вычисление относительной ссылки
Есть две переменные: $url и $link, $url хранит адрес текущей страницы за вычетом "http://<hostname>/", $link хранит адрес другой...

Вычисление относительной погрешности полинома
Относительная погрешность ведь не может быть отрицательной. А что делать если один из коэффициентов при переменной отрицательный и при...

Вычисление переменной с относительной точностью
Я новичок в работе с системой Matlab и столкнулся с одной проблемой. Кто-нибудь мог бы помочь?:wall: Задача такова: Для...

6
15.08.2011, 15:15

Не по теме:

У ссылок можно указывать относительные урлы. Если мы находимся на "http://localhost/theoretics/types/non_scalar/list/multy_linked/graph/", то браузер должен правильно все обработать.

<a href="../../../../scalar/pointer/">

0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.08.2011, 15:22  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Не по теме:
У ссылок можно указывать относительные урлы. Если мы находимся на "http://localhost/theoretics/types/non_scalar/list/multy_linked/graph/", то браузер должен правильно все обработать.
Ты не понял, я хочу в код страницы записать именно относительный путь, а скрипт для вычисления будет на странице редактора. На этой странице я введу абсолютный путь в поле <intpu type="text" name="link"> и получу готовый текст относительной ссылки, потом скопирожаю его в код страницы и готово. Если потом весь сайт с сетки скачать в локал, то и ссылка будет работать уже локально, а в твоём варианте она поведёт на сайт. И закачав перед этим сайт с локала, где он разрабатывается, на сервак, я тоже получу правильно работающую ссылку.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
15.08.2011, 19:22
Вот, наваял немного на все случаи жизни.
JavaScript
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function NormalizePath(p) {
    var m;
    p = String(p);
    if (!p) return '';
    // если нет слеша в начале
    if (p.charAt(0) != '/') p = '/' + p;
    // удаляем повторяющиеся слеши.
    // "текущие" папка в конце "foo/bar/baz/." должна оставлять слеш в конце
    // удаляем остальные "текущие" папки /.
    p = p.replace(/\/{2,}/g, '/').replace(/\/\.$/, '/').replace(/(?:^|\/)\.(?=\/)/g, '');
    // /.. в конце должно порождать директорию, поэтому добавляем слеш: "foo/bar/baz/.." = "foo/bar/"
    // удаляем /папка/..
    // удаляем ненужное /.. в начале, ибо выше некуда
    // если в итоге что-то изменилось, то повторить (повторить, потому что /a/b/c/../../d -> /a/b/../d -> /a/d)
    while (p != (m = p.replace(/\/\.\.$/, '/../').replace(/\/(?:[^\/]{3,}|[^.\/]+|\.[^.\/]|[^.\/]\.)\/\.\.(?=$|\/)/g, '').replace(/^(?:\/\.\.)+(?=$|\/)/g, ''))) p = m;
    return p;
};
 
function RelUrl(url, rel) {
/* RFC 3986: URI
 * [url]http://www.faqs.org/rfcs/rfc3986.html[/url]
 */
    rel = String(rel);
    // если пусто, то ничего не меняем
    if (!rel) return url;
    // если относительный путь на самом деле полный от протокола, то его и выдаем
    // протокол:
    else if (/^[^:\/?#]+:/.test(rel)) return rel;
    // в текущем урле ишем протокол, хост и путь, запрос и якорь
    // (протокол:)(//хост)(/путь)(?запрос)(#якорь)
    var m = String(url).match(/^([^:\/?#]+:)?(\/\/[^\/?#]*)?([^?#]*)(\?[^#]*)?(#.*)?/), proto, host, path, query, fragment;
    if (!m) return null;
    proto = m[1] || '';
    host = m[2] || '';
    path = m[3] || '';
    query = m[4] || '';
    fragment = m[5] || '';
    // если относительный путь от запроса, то игнорируем текущий запрос и якорь
    if (rel.charAt(0) == '?') return proto + host + path + rel;
    // если относительный путь от запроса, то игнорируем текущий запрос и якорь
    else if (rel.charAt(0) == '#') return proto + host + path + query + rel;
    // если относительный путь от протокола, то заменяем текущий хост игнорируем текущий путь и остальное
    else if (rel.substr(0, 2) == '//') {
        // (//хост)(/путь)(?запрос#якорь)
        m = rel.match(/^(\/\/[^\/?#]*)([^?#]*)((?:\?[^#]*)?(?:#.*)?)/);
        if (!m) return null;
        return proto + m[1] + NormalizePath(m[2]) + m[3];
    }
    else {
        // (/путь)(?запрос#якорь)
        m = rel.match(/^([^?#]*)((?:\?[^#]*)?(?:#.*)?)/);
        if (!m) return null;
        query = m[2];
        // если относительный путь от корня (от хоста), то игнорируем текущий путь
        if (rel.charAt(0) == '/') path = m[1];
        // иначе обычный относительный путь
        // удаляем "файл" из текущего пути и оставляем только директорию
        else path = path.replace(/[^\/]+$/, '') + m[1];
        return proto + host + NormalizePath(path) + query; // якорь уже включен в запрос
    };
};
Тестил
Тестил примерами из RFC 3986
HTML5
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>test</title>
    <style type="text/css">
table, tt {font: 10pt/normal monospace;}
table tr:nth-child(odd) {background:#f0f0f0;}
table tr:nth-child(even) {background:#fff;}
table td {background:none; padding:0 0.5em;}
table td.ok {color:#090;}
table td.err {color:#f00;}
    </style>
    <script type="text/javascript" src="rel-uri.js"></script>
</head>
<body>
 
<script type="text/javascript">
/* test by RFC 3986: URI. 
 * Section 5.4. Reference Resolution Examples
 * http://www.faqs.org/rfcs/rfc3986.html 
 */
var src = "http://a/b/c/d;p?q",
    test = [
        ["g:h"          , "g:h"],
        ["g"            , "http://a/b/c/g"],
        ["./g"          , "http://a/b/c/g"],
        ["g/"           , "http://a/b/c/g/"],
        ["/g"           , "http://a/g"],
        ["//g"          , "http://g"],
        ["?y"           , "http://a/b/c/d;p?y"],
        ["g?y"          , "http://a/b/c/g?y"],
        ["#s"           , "http://a/b/c/d;p?q#s"],
        ["g#s"          , "http://a/b/c/g#s"],
        ["g?y#s"        , "http://a/b/c/g?y#s"],
        [";x"           , "http://a/b/c/;x"],
        ["g;x"          , "http://a/b/c/g;x"],
        ["g;x?y#s"      , "http://a/b/c/g;x?y#s"],
        [""             , "http://a/b/c/d;p?q"],
        ["."            , "http://a/b/c/"],
        ["./"           , "http://a/b/c/"],
        [".."           , "http://a/b/"],
        ["../"          , "http://a/b/"],
        ["../g"         , "http://a/b/g"],
        ["../.."        , "http://a/"],
        ["../../"       , "http://a/"],
        ["../../g"      , "http://a/g"],
        ["../../../g"   , "http://a/g"],
        ["../../../../g", "http://a/g"],
        ["/./g"         , "http://a/g"],
        ["/../g"        , "http://a/g"],
        ["g."           , "http://a/b/c/g."],
        [".g"           , "http://a/b/c/.g"],
        ["g.."          , "http://a/b/c/g.."],
        ["..g"          , "http://a/b/c/..g"],
        ["./../g"       , "http://a/b/g"],
        ["./g/."        , "http://a/b/c/g/"],
        ["g/./h"        , "http://a/b/c/g/h"],
        ["g/../h"       , "http://a/b/c/h"],
        ["g;x=1/./y"    , "http://a/b/c/g;x=1/y"],
        ["g;x=1/../y"   , "http://a/b/c/y"],
        ["g?y/./x"      , "http://a/b/c/g?y/./x"],
        ["g?y/../x"     , "http://a/b/c/x"],
        ["g#s/./x"      , "http://a/b/c/g#s/./x"],
        ["g#s/../x"     , "http://a/b/c/x"],
        ["http:g"       , "http:g"]
    ],
    L = test.length,
    i,
    r;
document.write([
    '<p>Source URI: <tt>', src, '</tt></p>',
    '<table>',
    '<tr><th>Relative</th><th>Expected</th><th>Real</th></tr>'
].join(''));
for (i = 0; i < L; i++) {
    r = RelUrl(src, test[i][0]);
    document.write([
        '<tr>',
            '<td>', test[i][0], '</td>'+
            '<td>', test[i][1], '</td>'+
            '<td class="', test[i][1] == r ? 'ok' : 'err', '">', r, '</td>'+
        '</tr>'
    ].join(''));
};
document.write('</table>');
</script>
 
</body>
</html>
- работает правильно в Опере, FF и IE.
Использование
JavaScript
1
var uri = RelUrl('http://host/foo/bar/lol/baz', '../../lorem/ipsum');
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.08.2011, 20:05  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
function NormalizePath(p)
Что делает эта функция?

Добавлено через 14 секунд
Цитата Сообщение от Vovan-VE Посмотреть сообщение
function RelUrl(url, rel)
И что эта?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
16.08.2011, 18:56
Цитата Сообщение от taras atavin Посмотреть сообщение
Что делает эта функция?
NormalizePath(path) отдельно нормализует путь.
JavaScript
1
2
3
4
5
6
alert([
    NormalizePath('/a/b/./c/../d'), //  /a/b/d
    NormalizePath('a/b/c/.'), //  /a/b/c/
    NormalizePath('../../a/b/..'), //  /a/
    NormalizePath('/a/b/../c/d/../../e') //  /a/e
].join('\n'));
RelUrl(url, rel)
url - Исходный (текущий) урл, полный вместе с протоколом.
rel - относительный путь (см. тесты)
Возвращает новый полный урл.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
alert([
    RelUrl('http://a/b/c/d?e#f', 'g/h'), //  [url]http://a/b/c/g/h[/url]
    RelUrl('http://a/b/c/d?e#f', 'g/h/'), //  [url]http://a/b/c/g/h/[/url]
    RelUrl('http://a/b/c/d?e#f', './g/h'), //  [url]http://a/b/c/g/h[/url]
    RelUrl('http://a/b/c/d?e#f', '../g/h'), //  [url]http://a/b/g/h[/url]
    RelUrl('http://a/b/c/d?e#f', '/g/h'), //  [url]http://a/g/h[/url]
    RelUrl('http://a/b/c/d?e#f', '//g/h'), //  [url]http://g/h[/url]
    RelUrl('http://a/b/c/d?e#f', 'g:h'), //  g:h
    RelUrl('http://a/b/c/d?e#f', '?g'), //  [url]http://a/b/c/d?g[/url]
    RelUrl('http://a/b/c/d?e#f', '#g'), //  [url]http://a/b/c/d?e#g[/url]
    RelUrl('http://a/b/c/d?e#f', '') //  [url]http://a/b/c/d?e#f[/url]
].join('\n'));
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.08.2011, 19:40  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
RelUrl(url, rel)
url - Исходный (текущий) урл, полный вместе с протоколом.
rel - относительный путь (см. тесты)
Возвращает новый полный урл.
Мне надо наоборот: на входе два полных, а на выходе относительный из первого во второй.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.08.2011, 19:40
Помогаю со студенческими работами здесь

Вычисление абсолютной и относительной погрешности
Помогите пожалуйста, нужно написать програму которая будет считать абсолютную и относительную погрешности числа: x = x1 / x2 x1...

Получение адреса гиперссылки из поля гиперссылки
Здравствуйте! Подскажите пожалуйста, как не в VBA, а в конструкторе запросов вытянуть адрес гиперссылки? После преобразования...

Изменение цвета гиперссылки с цвета просмотренной гиперссылки на цвет не просмотренной
Здравствуйте! Имеется элемент управления &quot;надпись&quot;, в котором текст в формате гиперссылки. Подскажите, как этой гиперссылке вернут синий...

Величина относительной ошибки
Здравствуйте, мне нужно определить точность решения, то есть найти величину относительной ошибки решения для каждого уравнения системы...

Формула относительной погрешности
Уважаемые физики, пожалуйста помогите! Делаю лабораторную работу и там один из контрольных вопросов звучит так: а)Объясните формулу...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru