我的正则表达式不适用于简单的单词匹配

时间:2014-03-31 16:32:00

标签: php regex preg-match

我想查看当前请求是否在localhost上。为此,我使用以下正则表达式:

 return ( preg_match("/(^localhost).*/", $url) == true ||
            preg_match("/^({http|ftp|https}://localhost).*/", $url) == true )
            ? true : false;

以下是var_dump()的{​​{1}}:

$url

但是仍然会返回false。这个正则表达式有什么问题?

4 个答案:

答案 0 :(得分:2)

大括号在正则表达式中具有特殊含义,它们用于量化前面的字符。

所以:

/^({http|ftp|https}://localhost).*/

应该是这样的:

#^((http|ftp|https)://localhost).*#

编辑更改了分隔符,以便不需要转发正斜杠

答案 1 :(得分:2)

您当前正在使用正斜杠(/)作为分隔符,但您没有在模式字符串中转义它。这将导致错误,并导致preg_match()语句无效(如果您没有启用错误报告)。

此外,您正在错误地使用交替。如果您想匹配foobar,则需要撰写(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)://部分),这样做会使后面的比较器变得不必要;
  • 不需要最后的.*