2010-11-04 3 views
3

У меня есть HTML-текст, где мне нужно заменить слова на ссылки на них. Например, у меня есть текст со словом «PHP», и вы хотите его заменить < a href = "glossary.html # php" > PHP </a >. И есть много слов, которые мне нужно заменить.Могу ли я использовать переменные в шаблоне в Regex (C#)

Мой код:!

public struct GlossaryReplace 
{ 
    public string word; // here the words, e.g. PHP 
    public string link; // here the links to replace, e.g. glossary.html#php 
} 
public static GlossaryReplace[] Replaces = null;  

IHTMLDocument2 html_doc = webBrowser1.Document.DomDocument as IHTMLDocument2; 
string html_content = html_doc.body.outerHTML; 

for (int i = 0; i < Replaces.Length; i++) 
{ 
    String substitution = "<a class=\"glossary\" href=\"" + Replaces[i].link + "\">" + Replaces[i].word + "</a>"; 
    html_content = Regex.Replace(html_content, @"\b" + Replaces[i].word + "\b", substitution); 
} 
html_doc.body.innerHTML = html_content; 

Беда в том, - это не работает :(Но,

html_content = Regex.Replace(html_content, @"\bPHP\b", "some replacement"); 

этот код работает хорошо, я не могу понять свою ошибку

+0

Вы никогда не присваиваете ничего «Заменяет», поэтому цикл for никогда ничего не сделает. – diceguyd30

ответ

3

Вы забыли a @ здесь:

@"\b" + Replaces[i].word + "\b" 

Должно быть:

@"\b" + Replaces[i].word + @"\b" 

Я также рекомендую вам использовать HTML-парсер, если вы изменяете HTML. HTML Agility Pack - полезная библиотека для этой цели.

+0

Отлично! Благодаря! Оно работает! – Vdm17

3

Префикс @ для строк применяется только к следующей строке, поэтому при объединении строк вам может понадобиться использовать его для каждой строки.

Изменить это:

html_content = Regex.Replace(html_content, @"\b" + Replaces[i].word + "\b", substitution); 

к:

html_content = Regex.Replace(html_content, @"\b" + Replaces[i].word + @"\b", substitution); 

В регулярном выражении \b означает границу слова, но в строке это означает возврат каретки (ASCII 8). Вы получаете ошибку компилятора, если используете escape-код, который не существует в строке (например, \s), но не в этом случае, поскольку код существует как в строках, так и в регулярных выражениях.

На боковой ноте; метод, который полезен при динамическом создании шаблонов регулярных выражений, - это метод Regex.Escape. Он избегает символов в строке, которая будет использоваться в шаблоне, поэтому @"\b" + Regex.Escape(Replaces[i].word) + @"\b" заставит шаблон работать, даже если слово содержит символы, которые имеют особое значение в регулярном выражении.

+0

+1 Это тоже правильно. :) –

+0

Да, огромное спасибо! – Vdm17

+0

Я знаю об использовании \ b в регулярном выражении. А также спасибо за информацию о Regex.Escape – Vdm17

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