正则表达式匹配子文件夹

时间:2017-06-19 12:13:03

标签: c# regex html-agility-pack

我正在尝试基本上编写一个出站URL匹配器,这样我就可以替换包含URL的html流来指向我的CDN。因为我正在使用压缩,所以我无法使用IIS URL重写模块。我目前有一个正则表达式匹配特定文件类型的子文件夹,即

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

这很有效,并允许我从该点开始操纵字符串中的任何内容(即从" assets /"向右到右)。我需要实现的是操纵" assets /"左边的字符串。子文件夹,不一定知道格式?以下是一些例子:

<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' />

in css / inline styles:

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

无论如何,我想你得到的照片。我基本上希望能够看到&#34;左&#34; #34;资产&#34;直到我可以找到网址的逻辑起点,然后从那里操纵它指向我的CDN。

enter image description here

我不确定这是否可以在正则表达式中使用,因此欢迎使用regex / c#/ HTML Agility Pack组合的任何建议

1 个答案:

答案 0 :(得分:2)

这是你之后的事吗?

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

您可以在此处尝试:http://regexstorm.net/tester 或者在这里:https://regex101.com/r/b8XxcF/1

注意:在上面的正则表达式中,我逃脱了正斜杠字符。 .Net并不要求这样做,但不会抱怨;这样做使其与其他Regex引擎兼容;这意味着它可以在Regex101上进行测试。

使用这些工具进行测试时,您需要指定MultiLineSingleLine选项以获取assets/之前没有任何内容的示例,否则{{1 }字符不匹配该行的开头。您的代码中可能不需要此选项;即如果你一次只匹配一个字符串,而不是整个文本块。

<强>更新

误读道歉;您正在解析完整的HTML页面;不仅仅是从该页面返回的URI。要做到这一点,你可以使用类似的东西:

^

(幸运的是,字符["'\(](?<BeforeAssets>[^"'\(\)]*?)assets\/(?<AfterAssets>[A-Za-z0-9\-_\/.]+)\.(?<FileExtension>jpg|jpeg|bmp|tiff|png|gif|js|css|mov|mp4|ogg|avi|mp3)"'在网址中是非法的,因此应该可以检测变量的开头:https://tools.ietf.org/html/rfc3986#section-2.2。)< / p>

这不是万无一失的;最好使用HTML解析工具,然后从中提取URI;但如果你正在用正则表达式做所有事情,希望这会有所帮助。