Analyser une URL (compliquée)

1

C’est un problème épineux qui nécessite un niveau de maîtrise des fonctions Excel que je n’ai pas actuellement. J'étudie le site Excel depuis trop longtemps et je ne progresse toujours pas.

J'essaie de prendre une URL compliquée comme:

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

et analysez-le pour que je reçoive ceci:

live.domain.net

Le plus proche que j'ai eu est avec ceci:

http://dp18776.live.domiain.net

Ma logique:

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

La raison pour laquelle je ne peux pas m'arrêter là est que la partie locale peut être variable parmi les milliers d'enregistrements, alors que seul le domaine est (par exemple, live.domain.net) constant.

Je sais aussi que je dois utiliser la fonction MID. J'essayais de trouver des solutions plus basiques, mais le plus gros problème est que je dois pouvoir désactiver le ".net" pour récupérer le domaine. , je dois donc définir le point de départ dans MID () comme ".net" - len (domain)

Quelqu'un pourrait-il m'aider à compléter cette formule?

GPP
la source
2
Y a-t-il toujours un sous-réseau? Est-ce qu'il y a toujours des chiffres? Est-ce toujours la même longueur?
Raystafarian
Oui, il y a toujours un sous-réseau, délimité par 2x '. Ou ou 1.
GPP

Réponses:

4

Tout le monde ici semble se concentrer sur le .comou .net, mais les domaines ne se terminent pas toujours par .comou .net... cependant, ils se terminent toujours avant le /.

Donc, commencez par trouver où commence le nom d'hôte:

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

Ensuite, recherchez la première barre oblique par la suite - c'est là que le nom d'hôte se termine :

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

Ou, juste au cas où il n'y a pas de chemin du tout:

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

Et tout extraire entre:

=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)

Si vous voulez jeter le composant de domaine le plus à gauche, vous pouvez utiliser 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)

Pour Salesforce, sans vérification d'erreur:

=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))

Remarque: Ceci a encore quelques hypothèses - par exemple, cela ne fonctionnera pas correctement si les URL ont un username@domainou username:password@domain. La FIND(".")version suppose également qu'il existe au moins deux composants de domaine et ne fonctionnera pas correctement https://example/foo. Elle nécessite des vérifications supplémentaires de la part d'IFERROR ().

Grawity
la source
C'est la meilleure réponse. Bon travail, Grawity. C'est ce que je suis venu ici ajouter, mais vous l'avez déjà cloué.
picobit
Idem ce que @picobit a dit, c'est impressionnant, merci !! La seule nuance que j'ai maintenant: lorsqu’il tente d’importer dans Salesforce en tant que champ de formule, Salesforce n’a pas d’équivalent aux fonctions IFERROR; je dois donc réécrire pour cela. Des conseils sur la meilleure façon de s'attaquer?
GPP
1
Si vous êtes certain que toutes les URL auront un chemin (au moins un chemin vide, c. http://foo/-à- d. Et non http://foo), vous pouvez omettre complètement IFERROR (). Sinon, découvrez comment Salesforce rapporte les erreurs de FIND () ou SEARCH () ...
grawity
@grawity d'après ce que j'ai vu, les champs auront toujours une sorte de foo.domain.com/string/moreStrings/yetAnotherString , je ne suis donc pas très inquiet. Je commence à me demander comment dé-imbriquer l'instruction IFERROR: elle ressemble à IFERROR (FIND ("/", A34, FIND (".", A34) +1), LEN (A34) +1) est le bloc , mais il existe un opérateur moins succédant à la déclaration: - (FIND ("."; A1) +1))
GPP
@grawity en d'autres termes, la chaîne '- (FIND ("."; A1) +1))' fait-elle partie de la fonction IFERROR?
GPP
3

Vous pouvez utiliser regexp via VBA

et obtenez votre nom d'hôte avec quelque chose comme ça:

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

groupe 1:

live.domain.net
Evgeny Lebedev
la source
Intriguant, merci pour votre participation! J'essaie de m'en tenir aux fonctions moins puissantes 'LEFT' et 'MID', car je souhaite en fin de compte en faire un champ de formule Salesforce (j'ai été dirigé ici). Est-ce une attente réaliste? (Je fouille dans les liens Regex sur ce lien de réponse btw)
GPP
1

Sans savoir quelles sont les conditions de votre pièce locale et où sont vos accrochages, je chercherais l'extension puis le premier .car vous n'avez pas de www.. Si vous le faites, recherchez le second .. Je vous fournirai les parties, puis la formule réelle.

Rechercher n'importe quelle extension que vous devez trouver.

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

À la recherche de votre premier .

=SEARCH(".",A1)

Puis combinez-les dans =MID()

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

S'il n'y a pas toujours une partie locale, cela peut devenir plus compliqué. Il y a aussi d'autres façons de le faire si votre chaîne locale a toujours la même longueur ou a toujours une chaîne spécifique, ou certaines valeurs, etc.

Vous pouvez supprimer les iferrorportions si vous connaissez toujours l'extension, ou vous pouvez ajouter des extensions supplémentaires.

Raystafarian
la source