通过C#中的regex解析脚本和链接标记

时间:2015-02-13 15:13:43

标签: c# regex

我正在尝试这个正则表达式.. 但没有在代码中得到所需的结果..

<script[\s\w="'/]*src\s*=\s*['"]([\w/\.\d\s-]*)["']>|<link[/\s\w="\d]*href=['"]([\.\d\w\\/-]*)['"][\s\w="'/]*>

这是我的模式..

string pattern = @"<script\s[\d\s\w='";
pattern += "\"/]*";
pattern += @"src\s*=\s*['" + "\"]";
pattern += @"([\w/\.\d\s-]*)['" + "\"]>";
pattern += "|";
pattern += @"<link[/\s\w=\d" + "\"]*";
pattern += "href['\"](" + @"[\.\d\w/"+ Regex.Escape("\\") + "-]*)";
pattern += "['\"]" + @"[\s\w='/" + "\"]*>";

只是因为你找到了错误..为什么它在C#中不能正常工作 虽然测试都在以下链接上清除: http://regexr.com/3admv

可以肯定的是,这是代码:

string url = "http://www.uok.edu.pk";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        string html = reader.ReadToEnd();

        Regex regex = new Regex(GetDirectoryListingRegexForUrl(url));
        MatchCollection matches = regex.Matches(html);
        if (matches.Count > 0)
        {
            foreach (Match match in matches)
            {
                if (match.Success)
                {
                    Console.WriteLine("***************");
                    Console.WriteLine(match.ToString());

                }
            }
        }
    }
    Console.ReadLine();
}

如果您可以帮助我,请给我字符串模式以正确解析我在link中提供的html。 我似乎无法通过此正则表达式获取链接href。 感谢您的帮助:))

2 个答案:

答案 0 :(得分:3)

您可以通过将引号字符加倍来转义它们:

string pattern = @"<script[\s\w=""'/]*src\s*=\s*['""]([\w/\.\d\s-]*)[""']>|<link[/\s\w=""\d]*href=['""]([\.\d\w\\/-]*)['""][\s\w=""'/]*>";

        TextReader reader = File.OpenText("texttoparse.txt");// I put text from your example in this file
        string txt = reader.ReadToEnd();

        var matches = Regex.Matches(txt, pattern);
        foreach (Match match in matches)
        {
            if (match.Success)
            {
                Console.WriteLine("***************");
                Console.WriteLine(match.ToString());

            }
        }

输出(与RegExr测试相同):

***************
<link rel="import" href="component.html" >
***************
<link rel="stylesheet" href="css/style.css">
***************
<script src="js/script.js">
***************
<link rel="import" href="component.html">
***************
<link href="css/style-original.css" rel="stylesheet" type="text/css">
***************
<link href="css/style-original.css" rel="stylesheet" type="text/css" />
***************
<script type="text/javascript" src="/js/jquery.js">
***************
<script type="text/javascript" src="/js/cufon-yui.js">
***************
<script type="text/javascript" src="/js/arial.js">
***************
<script type="text/javascript" src="/js/chilli.js">
***************
<script type="text/javascript" src="/js/cycle.js">
***************
<script type="text/javascript" src="/js/functions.js">
***************
<script type="text/javascript" src="/js/fancybox.js">

答案 1 :(得分:2)

您似乎只想从HTML标记中提取“href”和“src”属性值。您可以使用正则表达式:

<(?:script|link)[^<]*?\s(?:src|href)=(?<quot>['"])(?<result>(?>(?!\k<quot>).)+)\k<quot>

由于我们永远不知道HTML代码中是否使用单引号或双引号,我们可以捕获第一个((?<quot>['"])),然后捕获与它不相等的所有内容((?<result>(?>(?!\k<quot>).)+)\k<quot>

您也可以将其拆分为单独的替代方案,命名捕获的组在C#中很棒:

<script[^<]*?\ssrc=(?<quot>['"])(?<result>(?>(?!\k<quot>).)+)\k<quot>|<link[^<]*?\shref=(?<quot>['"])(?<result>(?>(?!\k<quot>).)+)\k<quot>

$ {result} 会保留您的数据。