代码之家  ›  专栏  ›  技术社区  ›  Christopher

除了HTML标记中的内容外,哪个正则表达式将匹配文本?

  •  5
  • Christopher  · 技术社区  · 16 年前

    目前,我的代码如下所示(如下所示):

    const string highlightPattern = @"<span class=""Highlight"">$0</span>";
    DataBoundLiteralControl litCustomerComments = (DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Controls[0];
    
    // Turn "term1 term2" into "(term1|term2)"
    string spaceDelimited = txtTextFilter.Text.Trim();
    string pipeDelimited = string.Join("|", spaceDelimited.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries));
    string searchPattern = "(" + pipeDelimited + ")";
    
    // Highlight search terms in Customer - Comments column
    e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase);
    

    令人惊讶的是,它起作用了。但是,有时我匹配的文本是如下所示的HTML:

    <span class="CustomerName">Fred</span> was a classy individual.
    

    如果您搜索“class”,我希望突出显示的代码将“class”包装为“classy”,但当然不是正好在那里的HTML属性“class”!如果搜索“Fred”,则应突出显示。

    那么,有什么好的正则表达式可以确保匹配只发生在html标记之外呢?它不必是超级硬核。只需确保匹配不在<及>我想这很好。

    4 回复  |  直到 16 年前
        1
  •  11
  •   Julien Hoarau    16 年前

    此正则表达式应完成以下工作: (?<!<[^>]*)(regex you want to check: Fred|span) 它检查是否不可能匹配正则表达式 <[^>]* 从匹配字符串开始向后移动。

    修改代码如下:

    const string notInsideBracketsRegex = @"(?<!<[^>]*)";
    const string highlightPattern = @"<span class=""Highlight"">$0</span>";
    DataBoundLiteralControl litCustomerComments = (DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Controls[0];
    
    // Turn "term1 term2" into "(term1|term2)"
    string spaceDelimited = txtTextFilter.Text.Trim();
    string pipeDelimited = string.Join("|", spaceDelimited.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries));
    string searchPattern = "(" + pipeDelimited + ")";
    searchPattern = notInsideBracketsRegex + searchPattern;
    
    // Highlight search terms in Customer - Comments column
    e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase);
    
        2
  •  2
  •   Santiago Palladino    16 年前

    parser 在这里

        3
  •  0
  •   WolfmanDragon    16 年前

    嗯,我不是C程序员,所以我不知道它使用的正则表达式的风格,但是(?!<+?>)应该忽略标记内部的任何内容。它将迫使您使用&#60及#62,但无论如何,您都应该这样做。

        4
  •  0
  •   MSalters    16 年前

    编写一个能够处理CDATA节的正则表达式是很困难的。您可能不再认为>关闭标记。

    例如, "<span class="CustomerName>Fred.</span> is a good customer (<![CDATA[ >10000$ ]]> )"

    解决方案是(如前所述)解析器。他们能更好地处理你在工作中发现的那种混乱 CDATA <![CDATA ]]> CDATA 节可能包括文字 <