Что нового

Обрезать ссылку, что бы остался только домен

Soderling

Новичок
Сообщения
20
Репутация
0
Доброго времени суток. Регулярные выражения - это просто высшая математика, буду рад помощи.

Задача: обрезать любую ссылку так, что бы оставалось имя домена

Ссылки могут быть вида:


Нужно сделать так, что бы оставалось site.ru

нужно получить значение между " http:// ; https:// ; http://www. ; https://www. " и первым символом " / "
 

Tempo

Скриптер
Сообщения
597
Репутация
190
Код:
#include <Array.au3>

example()

Func example()
    Local $aUrls[] = ['http://site.ru/post/date/date/', _
            'https://www.site.ru/post/date/date/', _
            'https://site.ru/post/date/date/', _
            'http://www.site.ru']

    _ArrayDisplay($aUrls, 'Before')
    For $i = 0 To UBound($aUrls) - 1
        $aUrls[$i] = StringRegExpReplace($aUrls[$i], '(?im)https?://(?:www\.)?(.+?)(?:/.*|$)', '\1')
    Next
    _ArrayDisplay($aUrls, 'After')
EndFunc   ;==>example
 
Последнее редактирование:
Автор
S

Soderling

Новичок
Сообщения
20
Репутация
0
Отлично работает! Но столкнулся с новой проблемой.
Почему так происходит и как исправить?

Код:
; Если получаю ссылку из строки браузера - не обрезается

   $oElement_url = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Адресная строка и строка поиска")
   $URL = _UIA_ElementGetPropertyValue($oElement_url, "ValueValue")
   $URL = StringRegExpReplace($URL, '(?im)https?://(?:www\.)?(.+?)(?:/.*|$)', '\1')
   
   msgbox(64,'Сообщение', $URL)

; Если эту ссылку засунуть в переменную руками - работает


 $URL = "http://autoit-script.ru/threads/obrezat-ssylku-chto-by-ostalsja-tolko-domen.28082/#post-154387"
 $URL = StringRegExpReplace($URL, '(?im)https?://(?:www\.)?(.+?)(?:/.*|$)', '\1')

 msgbox(64,'Сообщение', $URL)
 

Tempo

Скриптер
Сообщения
597
Репутация
190
Из адресной строки вы в большинстве случаев получите ссылку без протокола
site.ru/post/date/date/
Код:
#include <Array.au3>

example()

Func example()
    Local $aUrls[] = ['http://site.ru/post/date/date/', _
            'https://www.site.ru/post/date/date/', _
            'https://site.ru/post/date/date/', _
            'http://www.site.ru', _
            'www.site.ru/date/date/', _
            'site.ru/date/date/']

    _ArrayDisplay($aUrls, 'Before')
    For $i = 0 To UBound($aUrls) - 1
        $aUrls[$i] = StringRegExpReplace($aUrls[$i], '(?im)(?:.+?://)?(?:www\.)?([^/]*).*', '\1')
    Next
    _ArrayDisplay($aUrls, 'After')
EndFunc   ;==>example
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 552
Репутация
2 429
Задача: обрезать любую ссылку так, что бы оставалось имя домена
Тут нужно уточнять, т.к доменное имя по сути может состоять из нескольких уровней, поэтому и my.site.ru тоже будет считаться именем домена.
Но как я понял в данном случае нужно получить имя домена 2-ого уровня (site.ru).
Также нужно учитывать что ссылка может содержать разные протоколы, поэтому любая ссылка может выглядеть и как ftp://site.ru (что в принципе учтено в последнем примере).

Код:
#include <Array.au3>

example()

Func example()
    Local $aUrls[] = _
        [ _
            'http://site.ru/post/date/date/', _
            'https://www.site.ru/post/date/date/', _
            'https://site.ru/post/date/date/', _
            'http://www.site.ru', _
            'ftp://www.site.ru/date/date/', _
            'ftp://my.site.ru/date/date/', _
            'www.site.ru/date/date/', _
            'site.ru/date/date/' _
        ]
  
    _ArrayDisplay($aUrls, 'Before')
    For $i = 0 To UBound($aUrls) - 1
        $aUrls[$i] = StringRegExpReplace($aUrls[$i], '(?i)^(?:.+://)?.*?([^\.]+\.[^/\.]+)(/.*|$)', '\1')
        ;Или так
        ;$aUrls[$i] = StringRegExpReplace($aUrls[$i], '(?i)^.*?([^\.:/]*\.[^/\.]*)(?:/.*)?$', '\1')
    Next
    _ArrayDisplay($aUrls, 'After')
EndFunc   ;==>example
 
Последнее редактирование:
Автор
S

Soderling

Новичок
Сообщения
20
Репутация
0
Честно говоря даже не подумал об этом)))
 
Верх