1

在 Wordpress 生成的页面中,有以下元标记:

<meta name="generator" content="WordPress 3.4.2" />

我正在寻找一种轻松提取“3.4.2”的方法(在上面的示例中)

使用 XmlDocument 或正则表达式会更快吗?

我找到了 JSoup,但这对于我正在尝试做的事情来说太过分了。

编辑

只是为了澄清 - 我不想包含任何外部库。
此外,这是在类库中运行的,因此也不能选择使用 powershell。

4

4 回答 4

3

由于您不想匹配成对的标签或任何东西,所以正则表达式应该没问题。只需搜索content="WordPress (\d\.\d\.\d)或类似。(如果真的一致,你可以搜索整个meta标签。)

尝试将 HTML 页面解析为 XmlDocument 可能行不通;并非所有有效的(或浏览器支持的)HTML 都是有效的 XML。

于 2012-10-19T23:44:08.797 回答
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();
                }
            }
        }
    }
}
于 2012-10-20T00:51:54.653 回答
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;
}
于 2012-10-20T15:55:15.807 回答
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
于 2012-10-19T23:59:07.137 回答