基本上,我想用其他标签替换html标签,例如:
</br> --> <LineBreak/>
<p> --> <Paragraph>
一开始,我用
convertedHtml = html.replace("</br>","<LineBreak/>");
这种方法的问题是需要管理所有案例,我想要一个泛型类。例如,此标记内容无法使用此方法:
<p class="foo"> --> <Paragraph>
<p id="bar"> --> <Paragraph>
.....
我该如何解决这个问题?
编辑:注意我事先并不知道标签中有哪些属性。我想要包含“p”,“/ p”,“br”,“b”,...
的替换标签答案 0 :(得分:1)
也许您可以使用HTML Agility Pack(http://htmlagilitypack.codeplex.com/)
您可以通过NuGet获取它,它允许您使用xPath从htmlDoc获取节点列表...然后您可以遍历这些列表并对每个节点执行操作...
答案 1 :(得分:0)
您应该使用正则表达式来解决此问题。有关更多信息,请访问this site。它将为您提供区分大小写/不敏感匹配的选项。
答案 2 :(得分:0)
我查看了一个较旧的项目,在那里我做了类似的事情。
看看我一直在使用的这种方法:
private static Regex _validAttributeOrTagNameRegEx =
new Regex(@"^\w+$", RegexOptions.Compiled |RegexOptions.IgnoreCase);
private const string STR_RemoveHtmlAttributeRegex =
@"(?<=<)([^/>]+)(\s{0}=['""][^'""]+?['""])([^/>]*)(?=/?>|\s)";
public static string RemoveHtmlAttribute(this string input, string attributeName) {
if (_validAttributeOrTagNameRegEx.IsMatch(attributeName)) {
Regex reg = new Regex(string.Format(STR_RemoveHtmlAttributeRegex, attributeName),
RegexOptions.IgnoreCase);
return reg.Replace(input, item => item.Groups[1].Value + item.Groups[3].Value);
} else {
throw new ArgumentException("Not a valid HTML attribute name", "attributeName");
}
}
我不确定这是否符合您的要求,但它可能是如何解决它的想法。从html标签中删除属性后,您可以使用旧方法convertedHtml = html.replace("</br>","<LineBreak/>");
答案 3 :(得分:0)
你可以尝试一些简单的字符串操作,不包括额外的namaspaces和工具:
请参阅此示例,也许它可以解决您的问题:
string html = string.Concat("<p class=\"foo\">",
"<p class=\"bar\">",
"<p>",
"</br>",
"<P>",
"</BR>"); // tags can be upper case as well
string strAux = html;
int tagOpenedAt=-1, tagClosedAt=-1;
bool isError = false;
do
{
tagOpenedAt = strAux.IndexOf('<');
tagClosedAt = strAux.IndexOf('>');
if(tagOpenedAt<tagClosedAt)
{
string fullTag = strAux.Substring(tagOpenedAt, tagClosedAt - tagOpenedAt + 1);
//<p> --> <Paragraph>
if (fullTag.ToLower().Equals("<p>") || fullTag.ToLower().StartsWith("<p "))
html = html.Replace(fullTag, "<Paragraph>");
//</br> --> <LineBreak/>
if (fullTag.ToLower().Equals("</br>"))
html = html.Replace(fullTag, "<LineBreak/>");
//more if conditions as you need them
strAux = strAux.Substring(tagClosedAt + 1);
}
else
{
isError = true;
}
}
while (tagOpenedAt>-1 && tagClosedAt>-1 && !isError);
很抱歉代码不好,也许您可以通过简单地执行 .ToLower()一次而不是每次 if 语句来改进。另外,我没有检查错误的标签,代码只是假设html是有效的。
只是编辑了一个位
string html = string.Concat("<p class=\"foo\">","\n",
"<p class=\"bar\">", "\n",
"<p>", "\n",
"</br>", "\n",
"<P>", "\n",
"</BR>");
Console.WriteLine("HTML is :\n{0}\n", html);
string strAux = html;
int tagOpenedAt=-1, tagClosedAt=-1;
bool isError = false;
do
{
tagOpenedAt = strAux.IndexOf('<');
tagClosedAt = strAux.IndexOf('>');
if(tagOpenedAt < tagClosedAt)
{
string _fullTag = strAux.Substring(tagOpenedAt, tagClosedAt - tagOpenedAt + 1);
string _lower = _fullTag.ToLower();
string _replace = null;
//<p> --> <Paragraph>
if (_lower.Equals("<p>") || _lower.StartsWith("<p "))
_replace = "<Paragraph>";
//</br> --> <LineBreak/>
if (_lower.Equals("</br>"))
_replace = "<LineBreak/>";
//more if conditions as you need them
if(_replace != null)
{
html = html.Replace(_fullTag, _replace);
Console.WriteLine("Replaced {0} with {1}", _fullTag, _replace);
}
strAux = strAux.Substring(tagClosedAt + 1);
}
else
{
isError = true;
}
}
while (tagOpenedAt>-1 && tagClosedAt>-1 && !isError);
Console.WriteLine("\nNew html is :\n{0}",html);