C # Regex заменить URL - PullRequest
       3

C # Regex заменить URL

2 голосов
/ 31 мая 2010

У меня есть куча ссылок в документе, которые должны быть заменены на вызов javascript. Все ссылки выглядят одинаково:

<a href="http://domain/ViewDocument.aspx?id=3D1&doc=form" target="_blank">Document naam 1</a>
<a href="http://domain/ViewDocument.aspx?id=3D2&doc=form" target="_blank">Document naam 2</a>
<a href="http://domain/ViewDocument.aspx?id=3D3&doc=form" target="_blank">Document naam 3</a>

Теперь я хочу заменить все эти ссылки на:

<a href="javascript:loadDocument('1','form')">Document naam 1</a>
<a href="javascript:loadDocument('2','form')">Document naam 2</a>
<a href="javascript:loadDocument('3','form')">Document naam 3</a>

Таким образом, Id = 3D в URL является первым параметром в функции, а параметр doc является вторым параметром в вызове функции.

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

Ответы [ 3 ]

5 голосов
/ 31 мая 2010
Regex regex = new Regex(@"http://domain/ViewDocument.aspx\?id=3D(\d+)&doc=(\w+)");
Match match = regex.Match(link.Href);
if (match.Success)
{
    link.Href = string.Format("javascript:loadDocument('{0}','{1}')", match.Groups[1].Value, match.Groups[2].Value);
}
2 голосов
/ 31 мая 2010

Вы можете использовать Html Agility Pack , чтобы помочь разобрать HTML. Вот как это можно сделать:

//Regex regex = new Regex(@"^http://domain/ViewDocument\.aspx\?id=3D(\d+)&amp;doc=(\w+)$");
Regex regex = new Regex(@"^http://domain/ViewDocument\.aspx\?id=3D(\d+)&doc=(\w+)$");
HtmlDocument doc = new HtmlDocument();
doc.Load("input.html");
var nodes = doc.DocumentNode
               .Descendants("a")
               .Where(node => regex.IsMatch(node.Attributes["href"].Value));

foreach (HtmlNode node in nodes)
{
    var href = node.Attributes["href"];
    href.Value = regex.Replace(href.Value, "javascript:loadDocument('$1','$2')");
    node.Attributes["target"].Remove();
}

doc.Save(Console.Out);

Результат:

<a href="javascript:loadDocument('1','form')">Document naam 1</a>
<a href="javascript:loadDocument('2','form')">Document naam 2</a>
<a href="javascript:loadDocument('3','form')">Document naam 3</a>
1 голос
/ 01 июня 2010

Polygenelubricants указал мне очень правильно, но удалил его ответ : (

Он дал мне эту ссылку . Благодаря ему я нашел свое решение:

string replaced = "";

string regex = "<a href=3D\"http://\\S+id=3D(\\d+)&doc=3D(\\w+)\" target=3D\"_parent\">";
Regex regEx = new Regex(regex);

replaced = regEx.Replace(mhtFile, "<a href=3D\"javascript:window.parent.loadDocument('$1','$2')\">");

Response.Write(replaced);

Для тех, кто заинтересован, эти ссылки находятся внутри файла .mht. Вот почему 3D ставятся после знака =. Переменная mhtFile содержит весь файл MHT в виде простого текста MHT.

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