2013-05-08 2 views
1

У меня есть требование добавить сегмент URL ко всем относительным или относительным URL-адресам в HTML-документе (например, атрибутах href или src) side applicationПодготовить сегмент 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-адресов, я просто хочу сосредоточиться на проблеме с регулярным выражением

Я полагаю, мне нужен рег ex, который может совпадать по любому шаблону src="..." или href="/..." и вставлять мою строку в начале после первой двойной двойной кавычки, но я недостаточно опытен с регулярными выражениями, чтобы понять это.

+0

Что это за/в? Например, для Apache существуют модули, которые могут переписывать URL-адреса «на лету». –

+0

Это стандартное приложение .NET ASP.NET, размещенное на IIS, в среде, в которой я не контролирую, alas – blue18hutthutt

ответ

2

Вы хотите найти URL-адрес, утверждать, что URL-адрес в настоящее время НЕ содержит/MyPathSegment /, и заменить его тем же свойством (href или src) и одним и тем же конечным 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>... 

Данные следующие это должны быть захвачены в улавливающей группу под названием «тег».

(?:href|src) 

матч Либо «href», либо «src». "?:»Означает не обязательно фиксировать результаты в это конкретное подвыражение, хотя результаты будут захватывать в родительском субе-выражение„метку“

=") 

Захват знак равенства и процитировать символ буквально, и закрыть группу захвата . для «метки»

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

примера условного оператора IF-находится в небольшом подвыражении, то ТО левая сторона чередования «|», то ELSE находится на правой стороне чередования .

(?=...) 

Пример Lookaround. В этом случае поиск - это «Look-Ahead». Это означает: проверьте, соответствует ли текст, следующий за текущей позицией, чем-то, но не продвигайте курсор.

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

Итак, кладем наши два примера вместе, и мы получаем условие, которое говорит ... Если после сбора HREF =», мы находим/MyPathSegment /, то ...

(?!) 

Это еще один Lookaround. Это отрицательный взгляд, но в нем ничего нет. Обычно это было бы (?! ...). Поскольку это отрицательный взгляд и он пуст, он автоматически выдает инструкцию Regex. если он видит, что ваш сегмент пути уже присутствует.

|/? 

Else, если/MyPathSegment/не найден ... необязательно найти косую черту, но это не в группе захвата.

(?<url>... 

Также в Else заявления ... После необязательного слэша, построить нашу второй захват группы под названием "URL"

[^"]*" 

ничего, что не является Quote ... Несколько раз (дополнительного Capture , измените * на +, если вы хотите что-то потребовать), а затем, поймав все, что НЕ является цитатой, также запишите цитату в группу захвата «url».

)) 

Сначала закрывает группу захвата URL, затем закрывает условную группу.

+0

Если я тестирую это в PowerShell с помощью « blue18hutthutt

+0

Я думаю, что утверждение должно быть проверено, если URL-адрес НЕ начинается с http: // или https: // с тех пор будет означать, что это был абсолютный URL-адрес пути, тогда как относительный/относительный URL-адрес сервера мог начинаться только с буквы (как часть сегмента URL) или /? – blue18hutthutt

+0

. Я не считаю, что PowerShell позволяет itionals в своем regex engine. Если это не так, может быть что-то другое. Он работает в VB/C# .Net. – Suamere

Смежные вопросы