1

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

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

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

相对于服务器 URL:

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

相对网址:

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

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

我想我需要一个可以匹配任何src="..."href="/..."模式的正则表达式,并在第一个打开的双引号之后的开头插入我的字符串,但对正则表达式的经验不足以解决这个问题。

4

1 回答 1

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 以“/”结尾

在一些事情上进行测试,如果你遇到任何可能需要调整的问题,请告诉我。

正则表达式伙伴示例

(?<tag>...

这之后的数据应该被捕获到一个名为“tag”的捕获组中。

(?:href|src)

匹配“href”或“src”。“?:”意味着不一定将结果捕获到该特定子表达式中,尽管结果将捕获到父子表达式“标签”中

=")

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

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

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

(?=...)

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

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

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

(?!)

这是另一个环视。这是一个负前瞻。但是里面什么都没有。通常是(?!...)。由于它是一个负前瞻并且它是空的,它会自动使 Regex 语句失败。如果它看到您的路径段已经在那里,我们希望它失败。

|/?

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

(?<url>...

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

[^"]*"

捕获任何不是引用的内容...多次(可选,如果您需要某些内容,将 * 更改为 +),然后在捕获所有不是引用的内容之后...也将引用捕获到“url”捕获组中.

))

先关闭url捕获组,再关闭条件组。

于 2013-05-08T15:53:20.687 回答