检查有效链接(URL)

时间:2010-07-06 04:08:58

标签: bash url hyperlink validation

我正在阅读这个other question,它有一些非常好的正则表达式,但据我所知,由于BASH命令不支持这种复杂的rexeg,所以它们不能用于BASH命令。<​​/ p >

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)选项,似乎可以使它工作。但如果有人有更好/更快的方式,我仍然会喜欢这里。

3 个答案:

答案 0 :(得分:18)

以下适用于Bash&gt; =版本3.2而不使用grep

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],所以我在这里添加了它们。

答案 1 :(得分:1)

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

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

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

编辑:为了回答您在问题中的编辑,我没有注意到该正则表达式在“扩展”语法中也有效。我认为你不会比那更好/更快。

答案 2 :(得分:1)

由于我没有足够的代表在上面发表评论,因此我将对此进行修改,以修改上面丹尼斯给出的答案。

我将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
相关问题