【问题标题】:How to parse link of web page from string?如何从字符串中解析网页链接?
【发布时间】:2014-08-25 17:51:50
【问题描述】:
Regex linkParser = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
                    string rawString = link;
                    foreach (Match m in linkParser.Matches(rawString))
                    {
                        string links = m.Value;
                    }

我试图从这个字符串中解析/获取链接:

<a href="http://rotter.net/cgi-bin/forum/dcboard.cgi?az=read_count&om=112190&forum=scoops1"><b>

我只想得到这部分:

http://rotter.net/cgi-bin/forum/dcboard.cgi?az=read_count&om=112190&forum=scoops1

但我在字符串链接中得到的是:

http://rotter.net/cgi-bin/forum/dcboard.cgi?az=read_count&om=112190&forum=scoops1"><b

最后剩下的是>

【问题讨论】:

  • 在锚点中还是从文本中?如果是前者&lt;a href=\"((http|https)://.*?)\"&gt; 或者使用像 Html Agility Pack 这样的 Protper 解析器
  • 请检查这个answer 到另一个类似的问题。
  • 请不要一次又一次地重新发布相同的问题,最好编辑您的old question 并在确实需要时重新打开它,但至于您的其他问题,最佳解决方案是NOT TO USE REGEX 但更多合适的工具比如HTML Agility Pack,只是因为HTML is no regular language

标签: c# .net


【解决方案1】:

尝试将\S+ 更改为[^\"\&gt;]+

最终字符串:\b(?:https?:\/\/|www\.)[^\"\&gt;]+\b

但这不仅能找到工作链接。如果您的链接类似于&lt;a href="www.a&lt;not working Link&gt;flupp"&gt;&lt;b&gt;,它将找到www.a&lt;not working Link。

这个表达式只查找到下一个" 或&gt; 之前的所有内容(如果它是一个有效的HTML-Form,并且你知道两个引号之间的文本是一个正常的链接,你只需要"(什么会让表达式变成\b(?:https?:\/\/|www\.)[^\"]+\b))。

使用它会找到www.a&lt;not working Link&gt;flupp,这正是两个引号之间的内容。

如果你想禁止更多字符,你必须编辑[^\"\&gt;]+。

顺便说一句:我认为在?:https?: 之后转义/ 可能是有意义的

这样做的原因是因为你告诉他找到所有非空白字符并且它应该以一个字母结尾。因为这个表达式是贪婪的,它会“吃掉”尽可能多的非空白字符。 " 和 &gt; 没有空格字符, 和 (TAB) 是。 [^\"]+ 告诉他获取所有字符,直到找到 "。找到后他会停下来。

【讨论】:

    【解决方案2】:

    我发现像某些人所说的那样使用HTMLAgilityPack,因为 HTML 不是常规语言。下载后考虑到这是源中唯一包含此文本的节点:

                HtmlAgilityPack.HtmlDocument hp = new HtmlAgilityPack.HtmlDocument();
                string source = File.ReadAllText( @"C:\Users\Admin\Desktop\source.txt" );
                hp.LoadHtml(source);
                var node = hp.DocumentNode.SelectSingleNode("//a[contains(@href, 'http://rotter.net/cgi-bin/forum/dcboard.cgi?az=read_count&om=112190&forum=scoops1')]");
                string found = node.Attributes["href"].Value;                        
                Console.WriteLine(found);
    

    您可以从任何您想要的地方拉取您的源代码,可以通过网络客户端或本地文件下载。这将返回:http://rotter.net/cgi-bin/forum/dcboard.cgi?az=read_count&amp;om=112190&amp;forum=scoops1

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      相关资源
      最近更新 更多