域名正则表达式不匹配

时间:2014-05-17 06:06:32

标签: regex shell sh

我在/ www / cgi-bin / test上有一个shell脚本,我可以通过http://192.168.1.1/cgi-bin/test在我的网络上访问。

我试图解析查询字符串,它应该看起来像d=domain.com,并根据正则表达式验证它:

#!/bin/sh

echo "Content-type: text/html"
echo ""

domain=${QUERY_STRING#d=}

if [[ ! $domain =~ [A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,}) ]]; then
    exit
fi

echo "Validation success!"

如果这不起作用,我尝试使用另一个我从here偷走的正则表达式:

if [[ ! $domain =~ \
    ^(([a-zA-Z](-?[a-zA-Z0-9])*)\.)*[a-zA-Z](-?[a-zA-Z0-9])+\.[a-zA-Z]{2,}$ \
]]; then
    exit
fi

我无法让这个正则表达式匹配。在这两种情况下,我都尝试根据Advanced Bash-Scripting Guide转义花括号(\{2,\}),但这没有任何区别。

如果相关,我所使用的平台是OpenWrt 12.09。

编辑:我刚刚意识到我的shell脚本可能不支持bash的[[ ... =~ ... ]]语法。不幸的是,OpenWrt不附带bash。

2 个答案:

答案 0 :(得分:2)

你的正则表达式看起来很好,但问题似乎出在填充变量domain的字符串操作中。

您需要替换:

domain=${QUERY_STRING#d*=}

通过

domain=${QUERY_STRING#?d=}

这将在domain.com

中为您提供:$domain

更新:你错了shebang #!/bin/sh

你需要:

#!/bin/bash

更新2 :您可以在sh(非重击)中执行此操作以获得所需的值:

QUERY_STRING='d=domain.com'
domain=`echo "$QUERY_STRING" | awk -F'd=' '{print $2}'`
echo "$domain"
domain.com

要验证您可以使用egrep

echo "$domain" | egrep -q '[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,})'

答案 1 :(得分:1)

如果您没有bash,并且/或者您无法用#!/bin/bash替换shebang,那么[[表达式可能无效,或者模式替换为{{1可能行不通。

在这种情况下,您可以使用${QUERY_STRING#pattern}一举两得:

awk

或者,如果模式替换有效,而且只有正则表达式没有,那么您可以使用if ! echo $QUERY_STRING | awk '$0 !~ /^d=[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,})$/ {exit 1}'; then exit 1 fi 代替expr

awk

在这两种情况下,我对domain=${QUERY_STRING#d=} if ! expr $domain : '[A-Za-z0-9-]\{1,\}\(\.[A-Za-z0-9-]\{1,\}\)*\(\.[A-Za-z]\{2,\}\)$' >/dev/null; then exit 1 fi 中的d=使用了更严格的模式。在这两种情况下,请小心使用QUERY_STRING结束模式,否则$之类的内容会通过。