正则表达式帮助替换<span> </span>标记中的空格

时间:2009-08-31 17:18:58

标签: .net regex

尝试使用正则表达式将任何空格替换为“&amp; nbsp;”,例如html

<span someattr="a">and some words with spaces</span>

这是一个桌面应用程序,这个HTML来自/来自第三方控件,并没有使用任何类型的HTML解析的奢侈,所以我坚持使用正则表达式

我似乎无法想出一个与任意数量的span标签内的任何空格匹配的正则表达式。

由于

6 个答案:

答案 0 :(得分:1)

正则表达式本身不适合嵌套数据。如果你不能使用第三方解析器,最好的办法就是咬紧牙关并编写一些代码 - 也许使用解析器生成器 - 来解析嵌套。

(也就是说,检查你的regexp库的文档;你可能会发现它有扩展来帮助解析嵌套数据,例如.net的balancing groups构造)

答案 1 :(得分:1)

对于非常大的字符串,这可能会非常慢。

但这有效:

(?<=\<span[^>]*>[^<]+)\s(?=[^<]+\</span>)

使用替换字符串:

  

&安培; NBSP;

我说它可能很慢的原因是它必须找到空格(\ s)然后向左和向右搜索以查看它是否被span标记包围。它必须为每个空白字符单独做同样的事情。但我相信只要您的HTML格式正确并且您没有处理嵌套的span标记,这应该可靠地工作。

顺便说一句,因为这是针对.NET的,所以您可以使用Regex Hero为您构建代码:

string strRegex = "(?<=\<span[^>]*>[^<]+)\s(?=[^<]+\</span>)";
RegexOptions myRegexOptions = RegexOptions.None;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = "<span someattr=\"a\">and some words with spaces</span>";
string strReplace = "&nbsp;";

return myRegex.Replace(strTargetString, strReplace);

答案 2 :(得分:1)

将以下所有出现的内容替换为"&nbsp;"

(?<=<span\b[^>]*>(?:(?!</?span\b).)*(?(ReverseDepth)(?!))(?:(?:<span\b[^>]*>(?<-ReverseDepth>)|</span>(?<ReverseDepth>))(?:(?!</?span\b).)*)*)\u0020(?![^<]*>)

这适用于任何深度的span元素,无论其他元素是什么。 请注意,这仅适用于.net正则表达式。

这个正则表达非常挑剔。如果你试图改变什么,要小心。

感谢moonshadow在.net regexes中指出了奇特的开放式匹配语法。

答案 3 :(得分:0)

这个怎么样?请注意,代码块正在耗尽&nbsp;,因此我将&符号与文本的其余部分分开以使其可见。正则表达式替换中的行实际上是:

m.Groups["text"].Value.Replace(" ", "&nbsp;")

以下是样本:

string html = @"<span someattr=""a"">and some words with spaces</span>";
string pattern = @"<(?<tag>\w*)(?<attributes>[^>]+)?>(?<text>.*)</\k<tag>>";
string result = Regex.Replace(html, pattern,
                m => String.Format("<{0}{1}>{2}</{0}>",
                    m.Groups["tag"].Value,
                    m.Groups["attributes"].Value,
                    m.Groups["text"].Value.Replace(" ", "& nbsp;")
                    )
                );

结果= <span someattr="a">and&nbsp;some&nbsp;words&nbsp;with&nbsp;spaces</span>

但是,如果你有嵌套的span标签,事情会很快变得复杂。

编辑:重建标签和属性,添加字符串格式以整理

答案 4 :(得分:0)

半相关,在为此寻找解决方案时,我发现了一个基于php的perl正则表达式文章,对.net可能有帮助,也可能没有帮助。

http://www.thatsquality.com/articles/how-to-match-and-replace-content-between-two-html-tags-using-regular-expressions

答案 5 :(得分:0)

这似乎有效,但我肯定会先做一些严肃的单元测试(和代码清理)。这基于Regular Expression Cookbook的第3.17节和RegexBuddy的库片段。 (注意:不适用于嵌套的span标记。)

public class MyClass
{
    private static Regex outerRegex = new Regex("(?<=<span[^>]*>).*?(?=</span>)",
        RegexOptions.Singleline | RegexOptions.IgnoreCase);

    private static Regex innerRegex = new Regex(@"\s");

    public static void Main()
    {
        string subjectString = "my dog has <span someattr=\"a\">" +
            "and some words with spaces</span> fleas" +
            "<frog>space z</frog> <span> </span>";      

        string resultString = outerRegex.Replace(subjectString,
            new MatchEvaluator(ComputeReplacement));

        Console.WriteLine(resultString);
    }

    public static string ComputeReplacement(Match matchResult)
    {
        // Run the inner search-and-replace on each match of the outer regex
        // (the string was not getting escaped so I broke it up)
        return innerRegex.Replace(matchResult.Value, "&" + "nbsp;");
    }
}