使用preg_match检查主机名

时间:2012-01-16 16:56:45

标签: php regex

使用preg_match时遇到问题。 (我对正则表达式很新)

if(preg_match('^/http:\/\/myWebsite\.com\/', $_SERVER['HTTP_REFERER'])) {
return true;
}
else{
return false;
}

始终返回false而不应该返回false。我哪里错了?

更新

大家好!谢谢大家的帮助!现在每张支票都没问题

4 个答案:

答案 0 :(得分:2)

你的正则表达式缺少分隔符,因为PHP应该警告你:

$_SERVER['HTTP_REFERER'] = 'http://myWebsite.com/foo.html';
var_dump( preg_match('^/http:\/\/myWebsite\.com\/', $_SERVER['HTTP_REFERER']) );

...触发器:

  

警告:preg_match():没有结束分隔符

由于您可以选择自己的分隔符,因此选择一个不在文本中的分隔符更为简单:

preg_match('@^http://myWebsite\.com/@', $_SERVER['HTTP_REFERER'])

此外,如果文本没有修复(我认为不是这种情况),PHP可以为你解除它:

preg_match('/^' . preg_quote('http://myWebsite.com/', '/') . '/', $_SERVER['HTTP_REFERER'])

我建议您配置开发框以显示所有可能的错误。您有几种方法可以这样做:

  1. 修改您的php.ini文件:

    error_reporting = E_ALL | E_STRICT
    display_errors = On
    
  2. 将此放在您的脚本之上:

    <?php
    
    error_reporting(E_ALL | E_STRICT);
    ini_set('display_errors', TRUE);
    
  3. 如果PHP作为Apache模块运行,您还可以使用.htaccess文件:

    # Print E_ALL | E_STRICT from a PHP script to get the appropriate number:
    php_value error_reporting 2147483647
    php_flag display_errors on
    

答案 1 :(得分:1)

return (boolean) preg_match('#^http://myWebsite\.com/#i', $_SERVER['HTTP_REFERER']);

您可以选择自己的分隔符以简化操作。在这里,我选择了#

我还在末尾添加了i修饰符,以使搜索不区分大小写。

我删除了if / else分支,只返回preg_match的结果(type-casted to boolean)。

答案 2 :(得分:0)

它应该是'/^http:\/\/myWebsite\.com\//i'(注意插入符号(^)的位置,而i用于不区分大小写的匹配)

答案 3 :(得分:0)

preg_match需要有效的分隔符。它可能会抛出你没有看到的警告。你应该在开幕后放置carat ^。

同时尝试error_reporting(E_ALL);查看任何警告等。