2010-03-11 48 views
0

我有一个包含HTML的字符串,我需要将某些单词替换为链接 - 我使用以下代码执行此操作;正则表达式替换 - 但有一些例外

string lNewHTML = Regex.Replace(lOldHTML, "(\bword1\b|\bword2|word3\b)", "<a href=\"page.aspx#$1\">$1</a>", RegexOptions.IgnoreCase); 

该代码有效,但我需要包括一些例外 - 例如,我不会替换任何img-,li-和a-tag(包括链接文本和属性,如href和title),但仍然允许在p,td和div标签中进行替换。

任何人都可以想出这一个吗?

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml -self-contained-tags/1732454#1732454 – tanascius 2010-03-11 10:49:30

+1

这个答案在这里不适用(嗯,它确实,但不完全)。 .NET正则表达式实现支持匹配括号,因此它可能在这里处理这个简单的情况。 – Jens 2010-03-11 11:09:46

回答

1

好吧,经过一段时间的尝试构建一个合适的正则表达式,在这里我尝试..这可能需要额外的工作,但应指出你在正确的方向。

我匹配单词“word1”和“word2”,不在“tag1”或“tag2”标签内。当然,您需要根据自己的需要进行调整。如果您想保留我的格式,请启用RegexOptions.IgnorePatternWhitespace

不幸的是,我想出了一个正则表达式,你可以简单地插入到Regex.Replace中,因为这个正则表达式匹配整个字符串,因为之前的匹配,但是你关心的是第一组。该组包含索引和字的长度,所以你可以很容易地使用String.Substring取代它......

(?: 
    \G 
    (?: 
     (?> 
      <tag1(?<N>) 
      |<tag2(?<N>) 
      |</tag1(?<-N>) 
      |</tag2(?<-N>) 
      |.)*? 
     (?(N)(?!)) 
    )* 
) 
(word1|word2) 
+0

正则表达式似乎工作完美 - 好吧,差不多...除了我自己的应用程序,我正在使用RegEx Tracer来测试正则表达式,如果我写一个长字符串(从长度大约500开始到2000年),以取代它崩溃。我试图给它一些额外的工作,但没有运气 - 任何想法为什么它崩溃和做什么? – keysersoze 2010-03-11 16:16:20

+0

对不起,我不知道RegEx Tracer。 – Jens 2010-03-12 07:04:25

+0

我在我自己的自定义winform/webform应用程序中使用正则表达式时遇到完全相同的问题 - 当我的字符串lOldHTML超过几个字符时,应用程序崩溃。 – keysersoze 2010-03-15 08:36:00

1

您需要使用Match重载与MatchEvaluator参数,以便检查每个匹配并决定是否替换。

+0

我一直在试验MatchEvaluator,但可以找出如何使用这种方法解决我的问题。 我没有使用MatchEvaluator就解决了一件事,那就是如何避免替换属性,即: string lNewHTML = Regex.Replace(lldldML,“(?)*)(\ bword1 \ b | \ bword2 | word3 \ b)”,“$1”,RegexOptions.IgnoreCase); 但是,我仍然需要在一些特定的标签(例如,我的链接文本不能替换)中对值进行豁免。 任何意见/建议? – keysersoze 2010-03-11 12:37:59