1

サーバー側アプリケーションの HTML ドキュメント (href または src 属性など) 内のすべての相対 URL またはサーバーからの相対 URL の先頭に URL セグメントを追加する必要があります。

私は .NET 環境で作業していますが、残念ながら、HTML 文字列を DOM にロードして操作するための適切な基本クラス ライブラリはありません (また、サードパーティ ライブラリを導入できるという贅沢もありません)。ポイント)、これは正規表現の置き換えの良い候補のようですが、これは私が少し苦手なものです

これらの 2 つのケースを処理できる正規表現が必要です。

サーバー URL との相対:

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

相対 URL:

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 では、引用符を二重にする必要があることに注意してください。

これを使えば、現在スラッシュを持っているかどうかは関係ありません。strPathPrepend が「/」で終わっていることを確認する必要があります

いくつかのことをテストして、微調整が必​​要な可能性のあるバンプに遭遇した場合はお知らせください.

RegexBuddy の例

(?<tag>...

これに続くデータは、「タグ」という名前のキャプチャ グループにキャプチャする必要があります。

(?:href|src)

「href」または「src」のいずれかに一致します。「?:」は、必ずしも結果をその特定のサブ式にキャプチャするわけではありませんが、結果は親サブ式の「タグ」にキャプチャされます。

=")

等号と引用符を文字通りキャプチャし、「タグ」のキャプチャ グループを閉じます。

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

例 条件ステートメント。IF は小さな部分式にあり、THEN は交互の "|" の左側にあり、ELSE は交互の右側にあります。

(?=...)

ルックアラウンドの例。この場合、ルックアラウンドは「ルックアヘッド」です。つまり、現在の位置に続くテキストが何かに等しいかどうかを確認しますが、カーソルを進めません。

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

したがって、2 つの例をまとめると、次のような条件が得られます... もし、href=" を収集した後、/MyPathSegment/ が見つかったら...

(?!)

これは別のルックアラウンドです。否定先読みです。しかし、そこには何もありません。通常は (?!...) です。これは否定先読みであり、空であるため、正規表現ステートメントは自動的に失敗します。パス セグメントが既にそこにあることがわかった場合は、失敗することを望んでいます。

|/?

または、/MyPathSegment/ が見つからない場合...オプションでスラッシュを見つけますが、キャプチャ グループにはありません。

(?<url>...

Else ステートメントでも...オプションのスラッシュの後に、「url」という名前の 2 番目のキャプチャ グループを作成します。

[^"]*"

引用ではないものをすべてキャプチャします...複数回(オプション、何かを必要とする場合は*を+に変更します)、引用ではないすべてをキャッチした後...引用を「url」キャプチャグループにもキャプチャします.

))

最初に URL キャプチャ グループを閉じ、次に条件付きグループを閉じます。

于 2013-05-08T15:53:20.687 に答える