我想查看当前请求是否在localhost上。为此,我使用以下正则表达式:
return ( preg_match("/(^localhost).*/", $url) == true ||
preg_match("/^({http|ftp|https}://localhost).*/", $url) == true )
? true : false;
以下是var_dump()
的{{1}}:
$url
但是仍然会返回false。这个正则表达式有什么问题?
答案 0 :(得分:2)
大括号在正则表达式中具有特殊含义,它们用于量化前面的字符。
所以:
/^({http|ftp|https}://localhost).*/
应该是这样的:
#^((http|ftp|https)://localhost).*#
编辑更改了分隔符,以便不需要转发正斜杠
答案 1 :(得分:2)
您当前正在使用正斜杠(/
)作为分隔符,但您没有在模式字符串中转义它。这将导致错误,并导致preg_match()
语句无效(如果您没有启用错误报告)。
此外,您正在错误地使用交替。如果您想匹配foo
或bar
,则需要撰写(foo|bar)
,而不是 {foo|bar}
。
更新的preg_match()
应如下所示:
preg_match("/^(http|ftp|https):\/\/localhost.*/", $url)
或使用不同的分隔符(因此您不必转义所有/
个字符):
preg_match("#^(http|ftp|https)://localhost.*#", $url)
答案 2 :(得分:1)
此
{http|ftp|https}
错了。
我想你的意思是
(http|ftp|https)
此外,如果您只想要群组而不捕捉,请添加?:
:
(?:http|ftp|https)
答案 3 :(得分:1)
我会将您当前的代码更改为:
return preg_match("~^(?:(?:https?|ftp)://)?localhost~", $url);
您使用{
和}
进行分组,当这些用于量化时,则表示文字{
和}}字符。
要补充的一点是:
https?
代替(http|https)
; (?:https?|ftp)://
部分),这样做会使后面的比较器变得不必要; .*
。