我正在尝试基本上编写一个出站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。
我不确定这是否可以在正则表达式中使用,因此欢迎使用regex / c#/ HTML Agility Pack组合的任何建议
答案 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上进行测试。
使用这些工具进行测试时,您需要指定MultiLine
或SingleLine
选项以获取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;但如果你正在用正则表达式做所有事情,希望这会有所帮助。