来自字符串问题的Preg_match()

时间:2014-04-22 15:57:34

标签: php regex usort

情况

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

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 个答案:

答案 0 :(得分:1)

您的时区看起来有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})\)$/

答案 1 :(得分:0)

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