.NET Regex: замена ссылок и img src - PullRequest
       16

.NET Regex: замена ссылок и img src

0 голосов
/ 14 сентября 2009

All

Мне нужно написать регулярное выражение для выполнения следующих операций заменить

(A)

src ="/folder/image.jpg"

или

src="http://www.mydomain.com/folder/image.jpg"

с

src="/cache/getCacheItem.aspx?source_url=http://www.mydomain.com/folder/image.jpg"

(B)

href="/folder/file.zip"

или

href="http://www.mydomain.com/folder/file.zip"

с

href="/cache/getCaccheItem.aspx?source_url=http://www.mydomain.com/folder/file.zip

Я знаю, что могу использовать

(src|href).*?=['|\"](?<url>.*?)['|\"]

со значением замены

$1="/legacy_integration/cache/getCacheItem.aspx?source_url=$2"

чтобы поймать атрибуты src = ... и href = .... Однако мне нужно фильтровать по расширению файла - сопоставлять только допустимые расширения изображений, такие как jpg, png, gif, и сопоставлять только расширения href, такие как zip и pdf.

Есть предложения? Проблема может быть кратко изложена следующим образом: измените приведенное выше выражение, чтобы оно соответствовало только определенным расширениям файлов, и разрешите вставку домена http://www.mydomain.com/ только в том случае, если исходный URL-адрес был относительным, таким образом гарантируя, что выходной текст содержит домен ровно один раз.

Нужно ли выполнять это, используя два разных регулярных выражения, одно для исходного текста, включая домен, и другое без? Или я могу каким-то образом использовать оператор условного совпадения, который в сочетании с выражением замены будет вставлять домен или нет, в зависимости от того, содержит ли соответствующий текст домен?

Я знаю, что могу выполнить это с помощью пользовательского оценщика совпадений, но кажется, что может быть быстрее / эффективнее сделать это в самом регулярном выражении.

Предложения / комментарии

Ответы [ 4 ]

2 голосов
/ 14 сентября 2009

Это появляется все время . Regex не подходит для анализа нерегулярной грамматики, такой как HTML. Для этого используйте настоящий анализатор (например, пакет agility ).

1 голос
/ 14 сентября 2009

Работает ли следующее выражение?

Regex.Replace(url, 
@"(src|href)\s*=\s*(?:'|")((?:http://www\.mydomain\.com)?.*?(jpg|bmp|png))(?:'|")",
"$1 - /cache/getCacheItem.aspx?source_url=$2");

Идея состоит в том, что вы сопоставляете текст http://www.mydomain.com условно. Он будет включен как часть текста соответствия $ 2. Если он был там изначально, он попадет в замененную строку.

0 голосов
/ 14 сентября 2009

Как насчет этого?

var reg = new Regex("(/folder/[^\"]+)");
Match m = reg.Match("src=\"http://www.mydomain.com/folder/image.jpg\"");
var result = string.Format("src=\"/cache/getCacheItem.aspx? source_url=http://www.mydomain.com{0}\"", m.Groups[1].Value);
0 голосов
/ 14 сентября 2009

Этот шаблон будет соответствовать любому пути, если вы хотите ограничить путь, вы можете добавить его после? /.

(?<pre>(?:src|href)\W*=\W*(?:"|'))(?<url>(?:http://www\.mydomain\.com)?/(?<file>[^"']+))(?<post>"|')

Вот пример кода:

string pattern = "(?<pre>(?:src|href)\\W*=\\W*(?:\"|'))(?<url>(?:http://www\\.mydomain\\.com)?/(?<file>[^\"']+))(?<post>\"|')";

string test = "src =\"/folder/image.jpg\"\r\n"
            + "src=\"http://www.mydomain.com/folder/image.jpg\"\r\n"
            + "href=\"/folder/file.zip\"\r\n"
            + "href=\"http://www.mydomain.com/folder/file.zip\"";

string replacement = "${pre}/cache/getCacheItem.aspx?source_url=http://www.mydomain.com/${file}${post}";

test = Regex.Replace(test, pattern, replacement);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...