2012-09-20 3 views
0

Я прочитал html-файл как строковый builder.Now я хочу поставить якорный тег между h1, h2 и h3 и дать разные ссылки id и href. Итак, как я могу достичь этого. Я хочу, чтобы что-то делать. Я пробовал Sb.Replace("<h1>", "<h1> <a id=1>");, но я не могу дать uniqe Id привязке к тегу. Так как я могу читать все h1, h2 и h3 и помещать тег привязки и давать уникальный идентификатор привязному тегу.StringBuilder найти строку читать и заменять

+0

Вы не можете сделать это одним ударом. Возможно, лучше использовать RegEx, а затем выполнить замену 1 за раз и увеличить ваши идентификаторы. – lahsrah

+0

Спасибо, но Как я могу найти все h1, h2 и h3 из stringbuilder? – Hitesh

+2

[HtmlAgilityPack] (http://htmlagilitypack.codeplex.com/) –

ответ

1

Вы можете позвонить Regex.Replace в пространство имен System.Text.RegularExpressions и определить настраиваемый обратный вызов MatchEvaluator, где вы назначаете новые идентификаторы.

Что-то вроде следующего:

var regHeaders = new Regex(@"<(?<close>/)?h(?<header>\d)\s*>", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
var replaced = regHeaders.Replace(sb.ToString(), new MatchEvaluator(EvaluateHeaders)); 

И определить EvaluateHeaders обратного что-то вроде этого:

private static string EvaluateHeaders(Match m) 
{ 
    bool closeTag = m.Groups["close"].Success; 
    switch (int.Parse(m.Groups["header"].Value)) 
    { 
     case 1: // h1 
      return closeTag ? "</a></h1>" : "<h1><a href=\"header1\">Header1"; 
     // todo: your own implementation of the various other headers. 
     default: 
      return m.Value; 
    } 
} 

EDIT
В свете Вашего последнего комментария, я изменил код к следующему:

var regHeaders = new Regex(@"<h(?<header>\d)\s*>(?<content>.+?)</h\1>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); 
var replaced = regHeaders.Replace(sb.ToString(), EvaluateHeaders); 

private static string EvaluateHeaders(Match m) 
{ 
    switch(int.Parse(m.Groups["header"].Value)) 
    { 
     case 1: // <h1>content</h1> 
      return string.Format("<h1><a href=\"#\" id=\"{0}\">{0}</a><h1>", m.Groups["content"].Value); 
     default: 
      return m.Value; 
    } 
} 
+0

Спасибо, что ответили, что он работает отлично, но как я могу дать уникальный идентификатор каждому тегу привязки. – Hitesh

+0

В каком формате должны быть идентификаторы? –

+0

Теперь я хочу, чтобы идентификатор привязки был чем-то другим, а затем использовал переменную int. Мне нужен идентификатор для якоря, как показано ниже: Пример:

Тест

, поэтому я хочу что-то вроде

Test

. Вкратце мой идентификатор привязки будет моим контентом между h1, h2 и h3 tag.Thanks – Hitesh

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