在Wordpress生成的页面中,有以下元标记:
<meta name="generator" content="WordPress 3.4.2" />
我正在寻找一种轻松提取的方法,“3.4.2”(在上面的例子中)
使用XmlDocument或Regular Expression会更快吗?
我找到了JSoup,但这对我正在尝试做的事情来说太过分了。
修改
只是为了澄清 - 我不想包含任何外部库 此外,这是在类库中运行,因此使用powershell也不是一个选项。
答案 0 :(得分:3)
由于您没有尝试匹配配对标签或任何内容,正则表达式应该没问题。只需搜索content="WordPress (\d\.\d\.\d)
或类似内容。 (如果它确实一致,您可以搜索整个meta
标记。)
尝试将HTML页面解析为XmlDocument可能无法解决;并非所有有效(或浏览器支持的)HTML都是有效的XML。
答案 1 :(得分:1)
利用HTML Agility Pack解析HTML
编辑(要复制的代码)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
namespace HTMLAgilityExample
{
class Program
{
static void Main(string[] args)
{
string contentValue;
HtmlDocument document = new HtmlDocument();
document.Load("C:/test.html");
foreach(HtmlNode link in document.DocumentNode.SelectNodes("//meta[@content]"))
{
HtmlAttribute attribute = link.Attributes["content"];
if(attribute.Value.Contains("WordPress"))
{
contentValue = attribute.Value.Replace("WordPress", "").Trim();
}
}
}
}
}
答案 2 :(得分:1)
我想,因为你必须从属性值中解析出版本,并且因为听起来你不想在此任务之外进行任何广泛的HTML解析,所以我建议使用正则表达式。
这应该给你一个开始。表达式可以简化一点;也许没有必要指定属性值在元标记内。或者它可以收紧一点;也许最好指定“内容”属性。无论哪种方式,这都适用于我的快速测试。
请注意,为了更好的可读性,我喜欢在正则表达式中留下空格并包含IgnorePatternWhitespace选项。
var html = ""; // Populate the html string here
var options = RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace;
var regx = new Regex( "<meta\\s+? .*? WordPress\\s*? (?<version> [\\d\\.]+) [^\\d\\.] .*? />", options );
var match = regx.Match( html );
if ( match.Success ) {
var version = match.Groups["version"].Value;
}
答案 3 :(得分:0)
你可以使用powershell:
PS> [xml]$xml = '<meta name="generator" content="WordPress 3.4.2" />'
PS> ($xml.meta.content) -match "[\d\.]+"
True
PS> $matches[0]
3.4.2