情况
我正试图用正则表达式捕获字符串中的一个元素。我正试图从这些字符串中检索偏移量:
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})')/