2017-06-19 1 views
0

J'essaie d'écrire essentiellement un mappeur d'URL sortant afin de pouvoir remplacer un flux d'URL contenant des URL pour pointer vers mon CDN. Je ne peux pas utiliser le module de réécriture d'URL IIS comme j'utilise la compression. J'ai actuellement un regex qui correspond à un sous-dossier pour un à-dire de type de fichier spécifiqueURL correspondant à Regex par sous-dossier

Regex ASSET_PATH = new Regex(@"(?i)assets/([A-Za-z0-9\-_/.]+)\.(jpg|jpeg|bmp|tiff|png|gif|js|css|mov|mp4|ogg|avi|mp3)", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); 

Cela fonctionne très bien et me permet de manipuler quoi que ce soit dans la chaîne à partir de ce moment-là (ie de « actifs/» à compter du droite). Qu'est-ce que je dois réaliser est de manipuler la chaîne à gauche du sous-dossier "assets /", sans nécessairement connaître le format? Voici quelques exemples:

<img src="./assets/123/pig.jpg" /> 
<img src="http://mysite.blah/assets/123/pig.jpg" /> 
<img src="http://www.mysite.blah/assets/123/pig.jpg" /> 
<img src='assets/123/pig.jpg' /> 

dans des styles css/inline:

background-image : URL('assets/123/pig.jpg') 
background-image : URL(http://www.mysite.blah/assets/123/pig.jpg) 

De toute façon, je pense que vous obtenez l'image. Je veux essentiellement être capable de regarder à la "gauche" du mot "actifs" jusqu'à ce que je puisse trouver le point de départ logique de l'URL et ensuite manipuler à partir de là pour pointer vers mon CDN.

enter image description here

Je ne suis pas sûr que cela est possible regex, donc des suggestions en utilisant une combinaison de regex/C#/HTML Agilité Pack sont les bienvenus

+0

Vous avez écrit 'RegexOptions.IgnoreCase' deux fois. Il ne résoudra rien, ça me dérange .. – Olian04

+0

Je ne suis pas sûr de vous avoir compris. Voulez-vous dire comme [ceci] (https://regex101.com/r/IwHWCJ/1)? – Olian04

+0

@ Olian04 - C'est juste une faute de frappe (RegexOptions.IgnoreCase), peut-être que je devrais le laisser là pour vous piéger pour toujours ... LOL :-) –

Répondre

1

Est-ce que vous êtes après?

(?<BeforeAssets>.*?(?:\/|^))assets\/(?<AfterAssets>[A-Za-z0-9\-_\/.]+)\.(?<FileExtension>jpg|jpeg|bmp|tiff|png|gif|js|css|mov|mp4|ogg|avi|mp3)

Vous pouvez essayer ici: http://regexstorm.net/tester Ou ici: https://regex101.com/r/b8XxcF/1

NB: Dans le regex ci-dessus je me suis évadé de la barre oblique vers l'avant. .Net ne l'exige pas, mais ne se plaint pas; et ce faisant, cela est compatible avec d'autres moteurs Regex; ce qui signifie qu'il peut être testé sur Regex101.

Lors du test avec les outils dont vous aurez besoin de spécifier les MultiLine ou SingleLine options pour obtenir l'exemple où assets/ n'a rien qui le précède, car sinon le caractère ^ ne correspond pas au début de cette ligne. Cette option peut ne pas être requise dans votre code; c'est-à-dire si vous ne faites correspondre qu'une chaîne à la fois, plutôt qu'un bloc entier de texte.


Mise à jour

Toutes mes excuses pour une lecture erronée; vous analysez la page HTML complète; pas seulement les URI retournés depuis cette page. Pour ce faire, vous pouvez utiliser quelque chose comme:

["'\(](?<BeforeAssets>[^"'\(\)]*?)assets\/(?<AfterAssets>[A-Za-z0-9\-_\/.]+)\.(?<FileExtension>jpg|jpeg|bmp|tiff|png|gif|js|css|mov|mp4|ogg|avi|mp3)

(heureusement personnages ", ' et ( sont illégales dans l'URL, devrait donc être OK pour détecter le début d'une variable. https://tools.ietf.org/html/rfc3986#section-2.2)

Ce n'est pas infaillible; Il est préférable d'utiliser un outil d'analyse HTML, puis d'extraire les URI de cela; mais si vous faites tout avec regex, j'espère que cela vous aidera.

+0

Merci John, mais je ne pouvais pas obtenir que ça marche. J'utilise regex101 pour tester si claqué votre exemple là-dedans et rien ne correspond? en tant que source, vous pouvez littéralement utiliser la source de n'importe quelle page Web, puis changer l'un des liens d'image vers l'image d'exemple ci-dessus –

+0

Ah désolé; Je supposais que vous extrayiez les URI des liens, puis les utilisiez. Vous recherchez quelque chose qui trouve des liens n'importe où dans le code HTML. Va modifier ... – JohnLBevan

+1

Tu es une légende! –