字符串问题中的Preg_match()


Preg_match() from string issue

情况

我正试图用正则表达式捕获字符串中的一个元素。我正试图从这些字符串中检索偏移量:

America/Iqaluit (-4:00)
America/Anchorage (-8:00)

这些字符串在usort()函数使用的函数中传递,usort($timezones, "sortByTime");也是如此。以下是我用来对元素进行排序的代码:

function sortByTime($a, $b) {
    if(preg_match("/^[A-z]*'/[A-z]* '((-[0-9]:[0-9]{2})')/", $a, $matches)){
        $tz[0] = $matches[1];
    }
    if(preg_match("/^[A-z]*'/[A-z]* '((-[0-9]:[0-9]{2})')/", $b, $matches)){
        $tz[1] = $matches[1];
    }
    return $tz[1] - $tz[0];
}

问题

preg_match函数不适用于变量$a$b。我尝试用内联字符串更改变量,结果成功了。这里有一个例子:

preg_match("/^[A-z]*'/[A-z]* '((-[0-9]:[0-9]{2})')/", $b, $matches); //Doesn't work
preg_match("/^[A-z]*'/[A-z]* '((-[0-9]:[0-9]{2})')/", "America/Yellowknife (-6:00)", $matches); //Works

为什么以及如何解决此问题?

谢谢。

编辑

请注意$timezones数组的结构如下:

array(2) {
  ["America/Adak"]=>
  string(21) "America/Adak  (-9:00)"
  ["America/Anchorage"]=>
  string(26) "America/Anchorage  (-8:00)"
}

看起来您的时区中有2个空格,所以:

/^[A-z]*'/[A-z]*  '((-[0-9]:[0-9]{2})')/
// or
/^[A-z]*'/[A-z]*'s*'((-[0-9]:[0-9]{2})')/

如果你只是对时间感兴趣,部分匹配可能会更好:

/'(([-+][0-9]{1,2}:[0-9]{2})')$/

试试:/^'w+'/'w+ '((-?'d:['d]{2})')/