.net 将URL段前置到相对/相对服务器URL

.net 将URL段前置到相对/相对服务器URL,.net,regex,.net,Regex,我需要在服务器端应用程序上的HTML文档(例如href或src属性)中为所有相对或相对服务器URL预先添加URL段 我在.NET环境中工作,不幸的是,没有很好的基类库可以将HTML字符串加载到DOM中并对其进行操作(我现在也不能奢侈地引入第三方库),因此这似乎是一个很好的正则表达式替换的候选对象,然而,这是我有点弱的东西 我需要一个能处理这两种情况的正则表达式: 相对于服务器URL: href=“/controller/action”->href=“/MyPathSegment/controll

我需要在服务器端应用程序上的HTML文档(例如href或src属性)中为所有相对或相对服务器URL预先添加URL段

我在.NET环境中工作,不幸的是,没有很好的基类库可以将HTML字符串加载到DOM中并对其进行操作(我现在也不能奢侈地引入第三方库),因此这似乎是一个很好的正则表达式替换的候选对象,然而,这是我有点弱的东西

我需要一个能处理这两种情况的正则表达式:

相对于服务器URL:

href=“/controller/action”->href=“/MyPathSegment/controller/action”

相对URL:

href=“image/logo.gif”->href=“/MyPathSegments/image/logo.gif”

不要担心什么是
MyPathSegment
。我在其他地方有逻辑可以计算出相对URL的路径段级别,我只想关注regex问题


我想我需要一个正则表达式,它可以匹配任何
src=“…”
href=“/…”
模式,并在第一个双引号开头插入我的字符串,但我对正则表达式没有足够的经验来解决这个问题。

如果要查找URL,请断言URL当前不包含/MyPathSegment/,用相同的属性(HREF或SRC)替换它,和URL的相同端,但是在中间,把你的路径段:

(?<tag>(?:href|src)=")(?(?=/MyPathSegment/)(?!)|/?(?<url>[^"]*"))
在VB.Net中:

Dim strPathPrefix As String = "/MyPathSegment/"
Dim strTest As String = Regex.Replace("<a href=""/controller/action"" property=""something"">Hello World</a>", "(?<tag>(?:href|src)="")(?(?=" & strPathPrefix & ")(?!))/?(?<url>[^""]*"")", "${tag}/MyPathSegment/${url}")

strTest = <a href="/MyPathSegment/controller/action" property="something">Hello World</a>
匹配“href”或“src”。“?:”表示不必将结果捕获到该特定子表达式中,尽管结果将捕获到父子表达式“标记”中

按字面意思捕获等号和引号符号,并关闭“标记”的捕获组

示例条件语句。IF在小的子表达式中,THEN在交替“|”的左侧,ELSE在交替的右侧

(?=...)
示例环顾四周。在本例中,环视是“向前看”。这意味着:检查当前位置后面的文本是否等于某个值,但不要推进光标

(?(?=/MyPathSegment/)...
把我们的两个例子放在一起,我们得到一个条件,它说。。。如果在收集href=”之后,我们找到/MyPathSegment/,则

(?!)
这是另一个Lookaround。它是一个负的Lookaround。但其中没有任何内容。通常是(?)。由于它是一个负的Lookaround并且是空的,因此它会自动使Regex语句失败。如果它看到您的路径段已经在其中,我们希望它失败

|/?
否则,如果未找到/MyPathSegment/,可以选择查找斜杠,但它不在捕获组中

(?<url>...
捕获任何不属于报价的内容…多次(可选,如果您需要某些内容,请将*更改为+),然后在捕获所有不属于报价的内容后…也将报价捕获到“url”捕获组中

))

首先关闭url捕获组,然后关闭条件组。

这是用于/in的什么?例如,Apache有一些模块可以动态重写url。这是在IIS上托管的标准.NET ASP.NET应用程序中,在我无法控制的环境中,如果我在PowerShell中使用“进行测试”我认为需要检查断言URL是否以http://或https://开头,因为这意味着它是绝对路径URL,而相对/相对服务器URL只能以字母开头(作为URL段的一部分)或/?,我认为PowerShell不允许在其正则表达式引擎中使用条件。如果不是这样的话,可能是别的原因。它在VB/C#.Net中工作。我更新了答案,以便在.Net框架之外使用。按照现在的方式,它应该可以进行测试(确保选中.NETFramework选项)。在PowerShell中仍然不起作用,我仍然认为这是因为条件部分(?)太棒了-非常感谢!它在PowerShell之外工作(单引号是为了避开双引号)。看起来我有很多书要读,但是你能简单地解释一下吗?:,?=和?!做
(?(?=/MyPathSegment/)...
(?!)
|/?
(?<url>...
[^"]*"
))