需要有关正则表达式的帮助

时间:2011-12-05 17:26:19

标签: c# asp.net regex

假设我有像

这样的HTML
<html>
<Head>
<link type="text/css" href="c1.css" rel="stylesheet" />
<link type="text/css" href="c2.css" rel="stylesheet" />
<link type="text/css" href="c3.css" rel="stylesheet" />
<link type="text/css" href="c4.css" rel="stylesheet" />
<link type="text/css" href="c5.css" rel="stylesheet" />

<script type="text/javascript" src="j1.js"></script>
<script type="text/javascript" src="j2.js"></script>
</Head>

<body>

<script type="text/javascript" src="j3.js"></script>
<script type="text/javascript" src="j4.js"></script>

</body>
</html>

首先我将使用正则表达式,它将返回所有链接标记详细信息,第二个正则表达式将返回所有脚本标记详细信息。我搜索谷歌但是 没有任何合适的东西。如果有人知道这两个正则表达式,请告诉我。感谢

4 个答案:

答案 0 :(得分:2)

This回答是您正在寻找的答案。不要试图用正则表达式解析HTML。

答案 1 :(得分:2)

正如其他人所评论的那样,尝试用正则表达式解析HTML可能不是一个好习惯,但这就是你要求的。所以我们走了:

`link`标签的正则表达式

@"(?ix)" +
@"<link\s*type=\x22(?'type'.*?)\x22\s*" +
@"href=\x22(?'href'.*?)\x22\s*" +
@"rel=\x22(?'rel'.*?)\x22\s*" +
@"\/>";

`script`标签的正则表达式

@"(?ix)" + 
@"<script\s*type=\x22(?'type'.*?)\x22\s*" +
@"src=\x22(?'src'.*?)\x22\s*" +
@"><\/script>";

实施例

假设您的HTML包含在string类型的变量中:

public const string LINK_PATTERN = 
                        @"(?ix)" +
                        @"<link\s*type=\x22(?<type>.*?)\x22\s*" +
                        @"href=\x22(?<href>.*?)\x22\s*" +
                        @"rel=\x22(?<rel>.*?)\x22\s*" +
                        @"\/>";

public const string SCRIPT_PATTERN =
                        @"(?ix)" +
                        @"<script\s*type=\x22(?<type>.*?)\x22\s*" +
                        @"src=\x22(?<src>.*?)\x22\s*" +
                        @"><\/script>";

static void Main(string[] args)
{
    string html = getBody();

    Regex links = new Regex(LINK_PATTERN);
    Regex scripts = new Regex(SCRIPT_PATTERN);

    foreach (Match link in links.Matches(html)) 
    {
        Console.WriteLine("<link>: " + link);

        Console.WriteLine("\ttype: " + link.Groups["type"]);
        Console.WriteLine("\thref: " + link.Groups["href"]);
        Console.WriteLine("\trel: " + link.Groups["rel"]);

        Console.WriteLine("");
    }

    foreach (Match script in scripts.Matches(html)) 
    {
        Console.WriteLine("<script>: " + script);

        Console.WriteLine("\ttype: " + script.Groups["type"]);
        Console.WriteLine("\tsrc: " + script.Groups["src"]);

        Console.WriteLine("");
    }

    Console.ReadKey();
}

public static string getBody()
{
    string html = "";

    html += "<html>";
    html += "<head>";
    html += "<link type=\"text/css\" href=\"c1.css\" rel=\"stylesheet\" />";
    html += "<link type=\"text/css\" href=\"c2.css\" rel=\"stylesheet\" />";
    html += "<link type=\"text/css\" href=\"c3.css\" rel=\"stylesheet\" />";
    html += "<link type=\"text/css\" href=\"c4.css\" rel=\"stylesheet\" />";
    html += "<link type=\"text/css\" href=\"c5.css\" rel=\"stylesheet\" />";
    html += "<script type=\"text/javascript\" src=\"j1.js\"></script>";
    html += "<script type=\"text/javascript\" src=\"j2.js\"></script>";
    html += "<body>";
    html += "<script type=\"text/javascript\" src=\"j3.js\"></script>";
    html += "<script type=\"text/javascript\" src=\"j4.js\"></script>";
    html += "</body>";
    html += "</html>";

    return html;
}

答案 2 :(得分:1)

用正则表达式解析HTML并不是一个好主意,它需要一个真正的解析器才能正确地完成它。

虽然可以让它与您给出的第一个示例文本一起使用,但您似乎会花费每个醒着的时刻进行更改,以涵盖您必须解析的下一个文本中的每个“特殊情况”。 / p>

答案 3 :(得分:1)

此解析器似乎很受欢迎:HTML Agility Pack