【问题标题】:How to do advanced URL parsing with RegEx?如何使用 RegEx 进行高级 URL 解析?
【发布时间】:2011-04-25 07:10:25
【问题描述】:

我正在使用以下方法来解析 URL:

Regex.Replace(text, @"((www\.|(http|https|ftp)\://)[.a-z0-9-]+\.[a-z0-9\/_:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])",
                            "<a href=\"$1\" target=\"&#95;blank\">$1</a>", RegexOptions.IgnoreCase).Replace("href=\"www.", "href=\"http://www.");

效果很好,但是:

  1. asdhttp://google.com 将被解析,那么如何禁止“http://”/“www”之前的字符?

  2. 当 URL 在标签内时,我不希望它被解析:

[url]http://google.com[/url]

我该怎么做?

【问题讨论】:

  • IMG 和 LINK 标签内的 URL 怎么样,它们允许匹配吗?您描述中的“标签”是指a标签吗?

标签: c# regex parsing url


【解决方案1】:

在 http 和 www 之前使用 ^,这意味着您的字符串应该以 http、www 或 https 或 ftp 开头

^(www\.|(http|https|ftp)

【讨论】:

  • 但是像“google: http://google.com”这样的东西就不起作用了
  • @Alex:您是否有特定的字符串集需要被允许或不允许?因为如果您尝试包含 google,那么您也必须包含 adshttp。或者你必须像 http|ftp|https|google 那样对 google 进行硬编码
  • 我只需要解析文本中的 URL。就像任何论坛一样。 “你好,这是我的网站:http://as.com”——应该在这里解析 URL。 "Hihttp://as.com" - 不应该被解析。所以使用 ^ 和 $ 不是解决方案。
【解决方案2】:

在开头添加^,在末尾添加$,http之前和普通url之后什么都没有

Regex.Replace(text, @"^((www\.|(http|https|ftp)\://)[.a-z0-9-]+\.[a-z0-9\/_:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])$",
                            "<a href=\"$1\" target=\"&#95;blank\">$1</a>", RegexOptions.IgnoreCase).Replace("href=\"www.", "href=\"http://www.");

【讨论】:

    【解决方案3】:

    由于 url 似乎是文本的一部分或文本块,请使用 \b 作为单词边界:

    Regex.Replace(text, @"\b((www\.| ... "
    

    您的第二个问题有点棘手 - 您是否考虑过对这两个任务使用相同的正则表达式?

    【讨论】:

    • 看起来这就是我需要的。但是如何排除这个词呢?
    • @Alex - 我考虑了一下,但它并不那么简单。您可以在正则表达式之前使用(?&lt;=\[url\])(负面看法),但它不适用于[url]http://www.example.com[/url] - 捕获www.example.com。正如我所说,您可能需要为此编写一个小型解析器,因此您可以先解析这些标记,然后让正则表达式处理其余部分。
    • 好的,谢谢。我会尝试在网上找到一些关于 BB 代码解析器的信息。
    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 2018-07-30
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多