Что нового

Выделить домен из ссылки

vadimkou

Новичок
Сообщения
17
Репутация
2
Вопрос по регулярным выражениям. Как проще всего из ссылки типа www.сайт.ру/чтото/чтотоеще/итакдалее
выделить часть www.сайт.ру? (то есть лишь домен)
Это будут разные ссылки, соответственно, не известно сколько там будет букв или слешев. Иногда ссылки бывают такими: www.приставка.сайт.ру/чтото/чтотоеще/итакдалее, в этом случае мне тоже нужен только домен с "приставка". Собственно, на этом моменте у меня и получилась загвоздка.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
vadimkou,
Попробуйте так.
Код:
$sURL = 'http://autoit-script.ru/index.php/topic,8542.0.html'
$sHost = StringRegExpReplace($sURL, '.*://(.*?)/.*', '$1')
ConsoleWrite($sHost & @LF)
$sHost = StringRegExpReplace($sURL, '^(.*//.*?/).*', '$1')
ConsoleWrite($sHost & @LF)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
_WinAPI_UrlGetPart()
 
Автор
V

vadimkou

Новичок
Сообщения
17
Репутация
2
Спасибо, такой вариант в самый раз
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
madmasles [?]
Шаблон не учитывает www, я бы делал так:

Код:
$sSite = "http://www.site.ru/olol/what/ghg"
$sDomain = StringRegExpReplace($sSite, '(?i)^(?:(?:https?|ftp|mms|rtsp|news|irc|magnet)://)?(?:www\.)?(.+?)/.+', "\1")

ConsoleWrite($sDomain)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR [?]
Шаблон не учитывает www, я бы делал так:
Да, так лучше, только в конце надо + на * поменять:
Код:
$sSite = 'http://www.site.ru/'
$sDomain = StringRegExpReplace($sSite, '(?i)^(?:(?:https?|ftp|mms|rtsp|news|irc|magnet)://)?(?:www\.)?(.+?)/.+', '\1')
ConsoleWrite($sDomain & @LF)
$sSite = 'http://www.site.ru/'
$sDomain = StringRegExpReplace($sSite, '(?i)^(?:(?:https?|ftp|mms|rtsp|news|irc|magnet)://)?(?:www\.)?(.+?)/.*', '\1')
ConsoleWrite($sDomain & @LF)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А почему не воспользоваться API функциями? Windows именно их и использует...

:smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
А почему не воспользоваться API функциями?
Просто мне интересны рег.выражения. :smile:
И разница, как оказалось, есть:
Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

$Url = 'http://www.site.ru/olol/what/ghg'
ConsoleWrite('API Host: ' & _WinAPI_UrlGetPart($Url, $URL_PART_HOSTNAME) & @CR)
$sDomain = StringRegExpReplace($Url, '(?i)^(?:(?:https?|ftp|mms|rtsp|news|irc|magnet)://)?(?:www\.)?(.+?)/.*', '\1')
ConsoleWrite('RegExp Host: ' & $sDomain & @LF)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
madmasles [?]
И разница, как оказалось, есть:
Да, и в некоторых случаях API надёжнее, например при наличии порта, вот поправленный шаблон:

Код:
$Url = 'http://www.site.ru:8020/olol/what/ghg'
$sDomain = StringRegExpReplace($Url, '(?i)^(?:[a-z]{3,6}://)?(?:www\.)?(.*?)(:|/).*', '\1')
ConsoleWrite('RegExp Host: ' & $sDomain & @LF)



Добавлено:
Сообщение автоматически объединено:

Аналог _WinAPI_UrlGetPart с использованием RegExp:

Код:
#include <Array.au3>
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

$sURL = 'http://username:[email protected]:8020/page/data?full_query'
;~ $sURL = 'http://site.com:8020/page/data?full_query'

Dim $aAPI_Parts[$URL_PART_QUERY + 1] = [$URL_PART_QUERY]

For $i = $URL_PART_SCHEME To $URL_PART_QUERY
	$aAPI_Parts[$i] = _WinAPI_UrlGetPart($sURL, $i)
Next

$aRE_Parts = _URLGetPart($sURL)

_ArrayDisplay($aAPI_Parts, '_WinAPI_UrlGetPart')
_ArrayDisplay($aRE_Parts, '_URLGetPart')

Func _URLGetPart($sURL, $iPart = -1)
	Local $sSCHEME = StringRegExpReplace($sURL, '(?i)^([a-z]{3,6})://.*', '\1')
	Local $sHOSTNAME = StringRegExpReplace($sURL, '(?i)^(?:' & $sSCHEME & '://)(?:www\.)?(?:.*?@)?(.*?)(:|/).*', '\1')
	Local $sUSERNAME = StringRegExpReplace($sURL, '(?i)^(?:' & $sSCHEME & '://)(?:www\.)?(.*?):.*?@.*?/?.*', '\1')
	Local $sPASSWORD = StringRegExpReplace($sURL, '(?i)^(?:' & $sSCHEME & '://)(?:www\.)?.*?(?::(.*?)@|/).*', '\1')
	Local $sPORT = StringRegExpReplace($sURL, '(?i)^(?:' & $sSCHEME & '://)(?:www\.)?.+?:([^@]*?)/.*', '\1')
	Local $sQUERY = StringRegExpReplace($sURL, '(?i)^(?:' & $sSCHEME & '://)(?:www\.)?(?:.*?)(?::|/).*\?(.*?)', '\1')
	
	Local $aRet[7] = [6, $sSCHEME, $sHOSTNAME, $sUSERNAME, $sPASSWORD, $sPORT, $sQUERY]
	
	For $i = 1 To $aRet[0]
		If $aRet[$i] = $sURL Then
			$aRet[$i] = ''
		EndIf
	Next
	
	If $iPart = -1 Or (IsKeyword($iPart) And $iPart = Default) Or $iPart > $aRet[0] Then
		Return $aRet
	EndIf
	
	Return $aRet[$iPart]
EndFunc
 
Верх