Разбор (сложного) URL

1156
GPP

Это сложная задача, требующая уровня мастерства в Excel, которого у меня сейчас нет. Я слишком долго изучал сайт Excel и все еще не прогрессирую.

Я пытаюсь взять сложный URL, как:

http://dp18776.live.domiain.net/active/MO_Mi_WFM

и разобрать, чтобы я получил это:

live.domain.net

Самое близкое, что я получил, это:

http://dp18776.live.domiain.net

Моя логика:

=LEFT(A17, SEARCH(".net",A17)+3) 

Причина, по которой я не могу остановиться, заключается в том, что локальная часть может быть переменной для тысяч записей, тогда как только домен является постоянным (например, live.domain.net).

Я также знаю, что мне нужно использовать функцию MID, я тестировал то, с чем я мог справиться, на более основных функциях, но больший ключ в работе заключается в том, что мне нужно иметь возможность отключить ".net", чтобы получить домен, поэтому мне нужно установить начальную точку в MID () как ".net" - len (домен)

Кто-нибудь сможет помочь мне завершить эту формулу?

1
Всегда ли есть подсеть? У него всегда есть номера? Это всегда одна и та же длина? Raystafarian 8 лет назад 2
Да, всегда есть подсеть, разделенная 2x '. Или или 1. GPP 8 лет назад 0

3 ответа на вопрос

4
grawity

Everybody here seems to focus on the .com or .net, but domains don't always end with .com or .net... however, they always end before the /.

So first find where the host name begins:

=FIND("://", A1) + LEN("://") =FIND("://", A1) + 3 

Then find the first slash afterwards – that's where the host name ends:

=FIND("/", A1, FIND("://", A1) + 3) 

Or, just in case there's no path at all:

=IFERROR(FIND("/", A1, FIND("://", A1) + 3), LEN(A1) + 1) 

And extract everything in between:

=MID(A1;FIND("://";A1)+3;IFERROR(FIND("/";A1;FIND("://";A1)+3);LEN(A1)+1)-(FIND("://";A1)+3)) A1: https://www.example.com/foo/bar A2: =FIND("://";A1)+3 A3: =IFERROR(FIND("/";A1;A2);LEN(A1)+1) A4: =MID(A1;A2;A3-A2) 

If you want to throw away the leftmost domain component, you can use FIND(".",A1):

=MID(A1;FIND(".";A1)+1;IFERROR(FIND("/";A1;FIND(".";A1)+1);LEN(A1)+1)-(FIND(".";A1)+1)) A1: https://www.example.com/foo/bar A2: =FIND(".";A1)+1 A3: =IFERROR(FIND("/";A1;A2);LEN(A1)+1) A4: =MID(A1;A2;A3-A2) 

For Salesforce, with no error checks:

=MID(A1,FIND("://",A1)+3,FIND("/",A1,FIND("://",A1)+3)-(FIND("://",A1)+3)) =MID(A1,FIND(".",A1)+1,FIND("/",A1,FIND(".",A1)+1)-(FIND(".",A1)+1)) 

Note: This still has a few assumptions – e.g. it won't work right if the URLs have a username@domain or username:password@domain. The FIND(".") version also assumes there are at least two domain components and won't work right with https://example/foo – it needs some extra IFERROR() checks for that.

Это лучший ответ. Хорошая работа, гравитация. Это то, что я пришел сюда, чтобы добавить, но вы уже прибили это. picobit 8 лет назад 0
То же самое сказал @picobit, это впечатляет, спасибо !! Единственный нюанс, который у меня есть сейчас: при попытке импортировать в Salesforce как поле формулы, Salesforce не имеет эквивалента функциям IFERROR, поэтому мне нужно переписать для этого. Любые советы о том, как лучше всего решать? GPP 8 лет назад 0
Если вы уверены, что у всех URL-адресов будет путь (по крайней мере, пустой путь, то есть `http: // foo /`, а не `http: // foo`), вы можете полностью опустить IFERROR (). В противном случае выясните, как Salesforce сообщает об ошибках из FIND () или SEARCH () ... grawity 8 лет назад 1
@ Из того, что я видел, на полях всегда будет что-то вроде http://foo.domain.com/string/moreStrings/yetAnotherString/, так что я не очень волнуюсь. Я зацикливаюсь на том, как деинсталлировать оператор IFERROR: это выглядит как IFERROR (FIND ("/", A34, FIND (".", A34) +1), LEN (A34) +1) - это чанк , но есть оператор минус после оператора: - (НАЙТИ ("."; А1) +1)) GPP 8 лет назад 0
@grawity, другими словами, является ли строка - - (FIND ("."; A1) +1)) 'частью этой функции IFERROR? GPP 8 лет назад 0
@GPP: Нет, конечно, нет. Это обычный знак минус. (См. Редактировать) grawity 8 лет назад 0
@ Конечно, но из чего вычитается это утверждение? GPP 8 лет назад 0
@GPP: из возвращаемого значения IFERROR (...). grawity 8 лет назад 0
Спасибо Гравити! Я пометил ваш ответ на этот вопрос, но есть еще одна проблема: к некоторым URL-адресам добавлены числа, например: http://13723.live.streamingurl.com:80/VBNCASA_SC, что означает, что строка выглядит следующим образом. : live.streamingurl.com:80 Есть предложения как исправить? Я не могу использовать IFERROR, но другой вложенный оператор IF? GPP 8 лет назад 0
3
Evgeny Lebedev

You can use regexp via VBA

and get your hostname with something like that:

https?:\/\/[a-zA-Z0-9-]+\.([a-zA-Z0-9.-]+)\/.* 

group 1:

live.domain.net 
Интригующе, спасибо за участие! Я пытаюсь придерживаться функций «LEFT» и «MID» с меньшим энергопотреблением, поскольку в конечном итоге я стремлюсь превратить это в поле формулы Salesforce (меня направили сюда). Это реалистичное ожидание? (Я копаю ссылки на Regex на этой ссылке ответа) GPP 8 лет назад 0
1
Raystafarian

Without knowing what the conditions are of your local part and where your hangups are, I'd search for the extension and then the first . as you don't have a www.. If you do - search for the second .. I'll provide the parts and then the actual formula.

Searching for whatever extension you need to find.

=IFERROR((SEARCH(".com",A1)),0)+IFERROR((SEARCH(".net",A1)),0)+IFERROR(SEARCH(".org",A1),0) 

Searching for your first .

=SEARCH(".",A1) 

Then combine them in =MID()

=MID(A1,SEARCH(".",A1)+1,IFERROR((SEARCH(".com",A1)),0)+IFERROR((SEARCH(".net",A1)),0)+IFERROR(SEARCH(".org",A1),0)-SEARCH(".",A1)+3) 

If there isn't always a local part, then it may get trickier. There are also some other ways to do it if your local string is always the same length or always has a specific string, or certain values, etc.

You can get rid of the iferror portions if you always know the extension, or you can add additional extensions.

Похожие вопросы