按子文件夹匹配 URL 的正则表达式
Regex matching URL's by sub-folder
我正在尝试编写一个出站 URL 匹配器,以便我可以替换包含 URL 的 html 流以指向我的 CDN。我无法使用 IIS URL Rewrite 模块,因为我正在使用压缩。我目前有一个正则表达式匹配特定文件类型的子文件夹,即
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/内联样式:
background-image : URL('assets/123/pig.jpg')
background-image : URL(http://www.mysite.blah/assets/123/pig.jpg)
无论如何,我想你明白了。我基本上希望能够查看单词 "assets" 的 "left",直到找到 url 的逻辑起点,然后从那里操作它以指向我的 CDN。
我不确定这在正则表达式中是否可行,因此欢迎使用正则表达式/c#/HTML Agility Pack 组合的任何建议
这就是你想要的吗?
(?<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/
前面没有任何内容的示例,否则 ^
字符将不匹配该行的开头。您的代码中可能不需要此选项;也就是说,如果您一次只匹配一个字符串,而不是整个文本块。
更新
对误读表示歉意;您正在解析完整的 HTML 页面;不仅仅是从该页面返回的 URI。为此,您可以使用类似的东西:
["'\(](?<BeforeAssets>[^"'\(\)]*?)assets\/(?<AfterAssets>[A-Za-z0-9\-_\/.]+)\.(?<FileExtension>jpg|jpeg|bmp|tiff|png|gif|js|css|mov|mp4|ogg|avi|mp3)
(值得庆幸的是字符 "
、'
和 (
在 URL 中是非法的,因此应该可以检测变量的开头:https://www.rfc-editor.org/rfc/rfc3986#section-2.2.)
这不是万无一失的;最好使用 HTML 解析工具,然后从中提取 URI;但是如果你正在用正则表达式做所有事情,希望这会有所帮助。
我正在尝试编写一个出站 URL 匹配器,以便我可以替换包含 URL 的 html 流以指向我的 CDN。我无法使用 IIS URL Rewrite 模块,因为我正在使用压缩。我目前有一个正则表达式匹配特定文件类型的子文件夹,即
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/内联样式:
background-image : URL('assets/123/pig.jpg')
background-image : URL(http://www.mysite.blah/assets/123/pig.jpg)
无论如何,我想你明白了。我基本上希望能够查看单词 "assets" 的 "left",直到找到 url 的逻辑起点,然后从那里操作它以指向我的 CDN。
我不确定这在正则表达式中是否可行,因此欢迎使用正则表达式/c#/HTML Agility Pack 组合的任何建议
这就是你想要的吗?
(?<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/
前面没有任何内容的示例,否则 ^
字符将不匹配该行的开头。您的代码中可能不需要此选项;也就是说,如果您一次只匹配一个字符串,而不是整个文本块。
更新
对误读表示歉意;您正在解析完整的 HTML 页面;不仅仅是从该页面返回的 URI。为此,您可以使用类似的东西:
["'\(](?<BeforeAssets>[^"'\(\)]*?)assets\/(?<AfterAssets>[A-Za-z0-9\-_\/.]+)\.(?<FileExtension>jpg|jpeg|bmp|tiff|png|gif|js|css|mov|mp4|ogg|avi|mp3)
(值得庆幸的是字符 "
、'
和 (
在 URL 中是非法的,因此应该可以检测变量的开头:https://www.rfc-editor.org/rfc/rfc3986#section-2.2.)
这不是万无一失的;最好使用 HTML 解析工具,然后从中提取 URI;但是如果你正在用正则表达式做所有事情,希望这会有所帮助。