将URL段添加到服务器URL的相对/相对位置

时间:2013-05-08 15:41:55

标签: .net regex

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

我在.NET环境中工作,遗憾的是没有好的基类库可以将HTML字符串加载到DOM中并对其进行操作(我也没有能够引入第三方的奢侈品)在这一点上的库),所以这似乎是正则表达式替换的一个很好的候选者,但是这是我有点弱的东西

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

相对于服务器网址:

href="/controller/action" -> href="/MyPathSegment/controller/action"

相对网址:

href="image/logo.gif" -> href="/MyPathSegments/image/logo.gif"

不要担心MyPathSegment是什么..我在其他地方有逻辑可以找出相对URL的路径段的级别,我只想关注正则表达式问题

我认为我需要一个可以在任何src="..."href="/..."模式上匹配的正则表达式,并在第一个打开双引号之后插入我的字符串,但是对于正则表达式没有足够的经验来解决这个问题

1 个答案:

答案 0 :(得分:2)

你想找到一个URL,声明URL当前不包含/ MyPathSegment /,并用相同的属性(href或src)替换它,并使用相同的End-Of-URL,但在中间,放你的路径段:

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

替换为:

${tag}/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>

请注意,在VB中,我不得不将引号加倍。

有了这个用途,你当前是否有一个Slash就无关紧要了。您只需要确保strPathPrepend以“/”

结尾

对某些事情进行测试,如果遇到可能需要调整的任何颠簸,请告诉我。

RegexBuddy Example

(?<tag>...

此后的数据应该被捕获到名为“tag”的捕获组中。

(?:href|src)

匹配“href”或“src”。 “?:”表示不一定将结果捕获到该特定子表达式中,但结果将捕获到Parent子表达式“tag”

=")

从字面上捕获等号和引号,并关闭“tag”的捕获组

(?(...)...|...)

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

(?=...)

示例外观。在这种情况下,环视是“前瞻”。这意味着:检查当前位置后面的文本是否等于某些内容,但不要使光标前进。

(?(?=/MyPathSegment/)...

所以,把我们的两个例子放在一起,我们得到一个条件,说...如果,在收集href =“之后,我们找到/ MyPathSegment /,那么......

(?!)

这是另一个外观。这是一个否定的先行。但它没有任何内容。通常它会是(?!...)。由于它是一个负向前瞻并且它是空的,它会自动失败Regex语句。如果它看到您的路径段已经存在,我们希望它失败。

|/?

否则,如果找不到/ MyPathSegment / ...可选择找到斜杠,但它不在捕获组中。

(?<url>...

同样在Else语句中...在可选斜杠之后,构建我们的第二个名为“url”的捕获组

[^"]*"

捕获任何不是引用的东西......多次(可选,如果你想要要求改变*到+),那么在捕获所有不是引用的东西之后......将引用捕获到“url”中捕获组也。

))

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