【问题标题】:Check for valid link (URL)检查有效链接(URL)
【发布时间】:2011-03-12 03:19:32
【问题描述】:

我正在阅读这个other question,它有一些非常好的正则表达式,但据我所知,它们都不能与 BASH 命令一起使用,因为 BASH 命令不支持如此复杂的正则表达式。

if echo "http://www.google.com/test/link.php" | grep -q '(https?|ftp|file)://[-A-Z0-9\+&@#/%?=~_|!:,.;]*[-A-Z0-9\+&@#/%=~_|]'; then 
    echo "Link valid"
else
    echo "Link not valid"
fi

但这不起作用,因为 grep -q 不起作用......

编辑,好的,我刚刚意识到 grep 有一个“扩展正则表达式”(-E)选项,它似乎可以使它工作。但是,如果有人有更好/更快的方法,我仍然很乐意在这里讨论它。

【问题讨论】:

  • 您可能想要检查您提出这个问题的动机。程序员尝试对 URL/URI 和电子邮件地址进行静态评估,您可以证明它们在语法上是有效的,但不会告诉您它们的可访问性。例如,http://www.example.com/bogus#fragment 将始终在语法上有效,并且(可能)始终返回 404 错误。
  • 这个函数不需要知道链接是否有效,只知道它是一个链接。
  • 从不定位资源的 URL 有什么用?为什么还要麻烦检查?

标签: bash url hyperlink validation


【解决方案1】:

在不使用grep 的情况下,以下在 Bash >= 版本 3.2 中有效:

regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
string='http://www.google.com/test/link.php'
if [[ $string =~ $regex ]]
then 
    echo "Link valid"
else
    echo "Link not valid"
fi

您的正则表达式似乎不包含小写字母字符[a-z],所以我在此处添加了它们。

【讨论】:

  • http://печки-лавочки.рф/ 的错误,这是一个有效的 URL。可以在stackoverflow.com/questions/161738 找到更完整的正则表达式
  • 很好,与 egrep 完美配合(尤其是我需要一些以 .mp3 结尾的 url),Nicolas Raoul,两个问题: 1. 我正在寻找 bash 解决方案而不是 PHP ! (并不总是使用 bash,也不容易转换)而且,国际 SUX,它通常只适用于那个国家并且想要被所有人访问,不会使用标准 ascii 之外的 chrs(我住在这样的国家和尽量避免这种情况)...我什至不是在说您没有标记为解决方案的答案...
  • 这很有帮助。但我认为你想锚定正则表达式以避免像 'garbage http://google.com' 这样的字符串被传递为有效。我只是分别在正则表达式的开头和结尾添加了 ^ 和 $,如下所示:regex='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$'
  • 如果你想让它简短并且只检查字符串是否可能是一个 URL,使用regex='^[httpsfile]+://.*$'
【解决方案2】:

由于我没有足够的代表在上面发表评论,我将用这个修改上面丹尼斯给出的答案。

我将 Christopher 的更新合并到正则表达式中,然后添加了更多内容,因此 URL 必须至少采用这种格式:

http://w.w(必须有句号)。

并稍微调整了输出:)

regex='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]\.[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$'

url='http://www.google.com/test/link.php'
if [[ $url =~ $regex ]]
then 
    echo "$url IS valid"
else
    echo "$url IS NOT valid"
fi

【讨论】:

    【解决方案3】:

    可能是因为正则表达式是用 PCRE 语法编写的。看看你的系统上是否有(或可以安装)程序 pcregrep - 它的语法与 grep 相同,但接受与 Perl 兼容的正则表达式 - 你应该能够做到这一点。

    另一种选择是尝试将-P 选项改为grep,但手册页上说这是“高度实验性的”,因此它可能会或可能不会真正起作用。

    我会说你应该仔细考虑使用这个或任何正则表达式来验证 URL 是否真的合适。如果您想进行正确的验证,最好找到或编写一个小脚本,例如 Perl,以使用该语言的 URL 验证工具。

    编辑:针对您在问题中的编辑,我没有注意到该正则表达式在“扩展”语法中也有效。我不认为你可以变得更好/更快。

    【讨论】:

    • 这只是后端,在显示任何内容之前将在 php 中完成更多验证。
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2014-08-09
    • 2014-09-11
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多