尝试使用正则表达式将任何空格替换为“& nbsp;”,例如html
<span someattr="a">and some words with spaces</span>
这是一个桌面应用程序,这个HTML来自/来自第三方控件,并没有使用任何类型的HTML解析的奢侈,所以我坚持使用正则表达式
我似乎无法想出一个与任意数量的span标签内的任何空格匹配的正则表达式。
由于
答案 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 = " ";
return myRegex.Replace(strTargetString, strReplace);
答案 2 :(得分:1)
将以下所有出现的内容替换为" "
:
(?<=<span\b[^>]*>(?:(?!</?span\b).)*(?(ReverseDepth)(?!))(?:(?:<span\b[^>]*>(?<-ReverseDepth>)|</span>(?<ReverseDepth>))(?:(?!</?span\b).)*)*)\u0020(?![^<]*>)
这适用于任何深度的span元素,无论其他元素是什么。 请注意,这仅适用于.net正则表达式。
这个正则表达非常挑剔。如果你试图改变什么,要小心。
感谢moonshadow在.net regexes中指出了奇特的开放式匹配语法。
答案 3 :(得分:0)
这个怎么样?请注意,代码块正在耗尽
,因此我将&符号与文本的其余部分分开以使其可见。正则表达式替换中的行实际上是:
m.Groups["text"].Value.Replace(" ", " ")
以下是样本:
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 some words with spaces</span>
但是,如果你有嵌套的span标签,事情会很快变得复杂。
编辑:重建标签和属性,添加字符串格式以整理
答案 4 :(得分:0)
半相关,在为此寻找解决方案时,我发现了一个基于php的perl正则表达式文章,对.net可能有帮助,也可能没有帮助。
答案 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;");
}
}