我在wordpress博客中有一个内容标记,它将被移动到另一个标记不同的博客平台。
我被建议使用正则表达式并且在阅读和替换href标签等方面存在问题。
这是wordpress内容标记:
<content>Bild 4.
<a href="http://www.mertidattleva.se/?attachment_id=63" rel="attachment wp-att-63"><img class="alignright size-medium wp-image-63" alt="Uterum skapar mer" src="http://www.mertidattleva.se/wp-content/uploads/2013/04/016stor-300x200.jpg" width="300" height="200" /></a>Spontant sett smidigt.</content>
以下是新博客平台中的新标记,其结果相同:
<content>Bild 4 br&ouml;dtext
<img src="/image.axd?picture=016stor-300x200.jpg" alt="Uterum skapar mer" />
</content>
如您所见,新博客平台的标签较少,我想从原始内容中删除此信息:
href="http://www.mertidattleva.se/?attachment_id=63" rel="attachment wp-att-63"><img class="alignright size-medium wp-image-63" alt="Uterum skapar mer" src="http://www.mertidattleva.se/wp-content/uploads/2013/04
我试图用c#:
杀死内容字符串string replacedString = Regex.Replace(line, @"(?<=href=)", "\"ww2\"");
但有更多问题:我想删除href,rel,img class,src
如何在c#regex中编码以将文件016stor-300x200.jpg转换为新字符串?
我想重写文件但没有成功:
StreamWriter writer = new StreamWriter(file.DirectoryName + @"\" + file);
writer.WriteLine(replacedString);
答案 0 :(得分:0)
通常,使用正则表达式来解析HTML是不值得的。但在非常有限的情况下,它可能是有用的。如果您的输入始终以相同的方式进行格式化,则可以使用它。对于你的一个案例,这样的事情应该有效:
var regex = new Regex(@".*\/(.*\.jpg)");
var source = @"<content>Bild 4.
<a href=""http://www.mertidattleva.se/?attachment_id=63"" rel=""attachment wp-att-63""><img class=""alignright size-medium wp-image-63"" alt=""Uterum skapar mer"" src=""http://www.mertidattleva.se/wp-content/uploads/2013/04/016stor-300x200.jpg"" width=""300"" height=""200"" /></a>Spontant sett smidigt.</content>";
var dest = @"<content>Bild 4 br&ouml;dtext
<img src=""/image.axd?picture={0}"" alt=""Uterum skapar mer"" />
</content>";
var newString = string.Format(dest, regex.Match(source).Groups[1]);
不要试图从原始字符串中删除您不想要的内容,而是集中精力提取您想要的内容。您从/
到.jpg
的角色是什么,这就是我们正在分组的内容。然后我们只是将我们提取的内容替换为新标签。
您可能想要添加一些错误检查。例如,检查正则表达式是否确实匹配以及是否提取了组。
答案 1 :(得分:0)
使用REGEX解析XML或HTML内容是一个坏主意 您可以使用XML Reader或linq来解析XML文件 对于HTML文件,最好在.NET中使用htmlagilitypack 这里是遍历所有文件并更新href和src的完整示例。确保在分配或读取版本之前检查空值
string dirPath = @"c:\mydir";
string[] htmlfiles = System.IO.Directory.GetFiles(dirPath, "*.HTML", SearchOption.AllDirectories);//Filter can be *.xml
foreach (string filename in htmlfiles)
{
HtmlDocument document = new HtmlDocument();
document.Load(filename);
HtmlNodeCollection linknodes = document.DocumentNode.SelectNodes("//a");
for (int i = 0; i < linknodes.Count; i++)
{
HtmlNode node = linknodes[i];
var href = node.Attributes["href"].Value;
//Reassigning href value
node.Attributes["href"].Value ="put your replacement string";
}
HtmlNodeCollection imgnodes = document.DocumentNode.SelectNodes("//img");
for (int i = 0; i < imgnodes.Count; i++)
{
HtmlNode node = imgnodes[i];
var src = node.Attributes["src"].Value;
//Reassigning href value
node.Attributes["src"].Value = "put your replacement string";
}
document.Save(filename);
}//end of loop all files