preg_grep():编译失败:在偏移量0处无重复

时间:2018-06-22 07:07:20

标签: php preg-grep

将PHP从5.3更新到7.1.9后,我的get_browser_language函数不断出现此错误。

我试图用几种方法调试它,但是没有运气,变量等都是正确的。

代码;

function get_browser_language( ) {
    global $cachedb;
    $available = array();
    $default = get_option('def_lang','tr');
    // List available
    $avails = $cachedb->get_results( "SELECT `lang_code` FROM  ".DB_PREFIX."languages");
    foreach ($avails as $av){
    $available[] = $av->lang_code;     
    }
    if ( isset( $_SERVER[ 'HTTP_ACCEPT_LANGUAGE' ] ) ) {
        $langs = explode( ',', $_SERVER['HTTP_ACCEPT_LANGUAGE'] );
    if ( empty( $available ) ) {
      return $default;
    }
        foreach ( $langs as $lang ){
            $lang = substr( $lang, 0, 2 );
            if( in_array( $lang, $available ) ) {
                return $lang;
            }
            //Test for XX-nr
            $matches = preg_grep('/'.$lang.'/', $available);
            if($matches) { 
            if(isset($matches[0])) {            
            return $matches[0];
            }
            }
        }
    }
    return $default;
}

我在$matches = preg_grep('/'.$lang.'/', $available);不断收到警告

警告;

PHP Warning:  preg_grep(): Compilation failed: nothing to repeat at offset 0 ...

可能是什么问题?预先感谢!

1 个答案:

答案 0 :(得分:0)

@Toto通过他的评论给了我一个主意。花了一些时间检查$_SERVER['HTTP_ACCEPT_LANGUAGE']值后,有时会返回空值,我相信这就是我收到此警告的原因。

所以基本上我做了以下事情;

我改变了

//Test for XX-nr
$matches = preg_grep('/'.$lang.'/', $available);

对此;

//Test for XX-nr
if(ctype_alnum($lang)){
    $matches = preg_grep('/'.$lang.'/', $available);
    //error_log(print_r("LANG: " . $lang, TRUE));
}

因此,当$_SERVER['HTTP_ACCEPT_LANGUAGE']返回空结果时,它将返回默认的语言代码。