在 Wordpress 生成的页面中,有以下元标记:
<meta name="generator" content="WordPress 3.4.2" />
我正在寻找一种轻松提取“3.4.2”的方法(在上面的示例中)
使用 XmlDocument 或正则表达式会更快吗?
我找到了 JSoup,但这对于我正在尝试做的事情来说太过分了。
编辑
只是为了澄清 - 我不想包含任何外部库。
此外,这是在类库中运行的,因此也不能选择使用 powershell。
在 Wordpress 生成的页面中,有以下元标记:
<meta name="generator" content="WordPress 3.4.2" />
我正在寻找一种轻松提取“3.4.2”的方法(在上面的示例中)
使用 XmlDocument 或正则表达式会更快吗?
我找到了 JSoup,但这对于我正在尝试做的事情来说太过分了。
编辑
只是为了澄清 - 我不想包含任何外部库。
此外,这是在类库中运行的,因此也不能选择使用 powershell。
由于您不想匹配成对的标签或任何东西,所以正则表达式应该没问题。只需搜索content="WordPress (\d\.\d\.\d)
或类似。(如果真的一致,你可以搜索整个meta
标签。)
尝试将 HTML 页面解析为 XmlDocument 可能行不通;并非所有有效的(或浏览器支持的)HTML 都是有效的 XML。
利用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();
}
}
}
}
}
我想,既然你无论如何都必须从属性值中解析版本,而且听起来你不想在这个任务之外进行任何广泛的 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;
}
你可以使用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