这个问题直接关系到this SO我15分钟前提出的问题。这并不打算成为那个职位的重复职位,而是希望这更像是一次学习经历。preg_match应该如何调试
在提出的问题中,我试图找出导致preg_match没有找到错误的原因。该代码(不是我的)可用here。该错误最终成为Windows 3.11阵列中缺失的'/ i'。
为了这个问题,重要的是要注意我不要使用浏览器部分。
第一个问题,理所当然地提出了什么是$正则表达式中的值。但是,我仍然无法找到获得该价值的方法。
我最初尝试的是在函数之外声明一个全局变量,并且恰好在preg_match行设置全局变量等于regex之前。然后我试图回应全局变量。我被一个空白页面迎接。
我还要提到的是我(在问原来的问题时)移除了这个代码:
$user_agent = getBrowserOS();
$device_details = "<strong>Browser: </strong>".$user_agent['browser']."<br /> <strong>Operating System: </strong>".$user_agent['os_platform']."";
print_r($device_details);
echo("<br /><br /><br />".$_SERVER['HTTP_USER_AGENT']."");
就这样,我应该看到的唯一的事情是全局变量的值。相反,我什么也没看见。
有人可以解释这应该如何调试?
编辑:按照约翰·C·的答案
<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];
function getOS() {
global $user_agent;
$os_platform = "Unknown OS Platform";
$os_array = array(
'/windows nt 6.2/i' => 'Windows 8',
'/windows nt 6.1/i' => 'Windows 7',
'/windows nt 6.0/i' => 'Windows Vista',
'/windows nt 5.2/i' => 'Windows Server 2003/XP x64',
'/windows nt 5.1/i' => 'Windows XP',
'/windows xp/i' => 'Windows XP',
'/windows nt 5.0/i' => 'Windows 2000',
'/windows me/i' => 'Windows ME',
'/win98/i' => 'Windows 98',
'/win95/' => 'Windows 95',
'/win16' => 'Windows 3.11',
'/macintosh|mac os x/i' => 'Mac OS X',
'/mac_powerpc/i' => 'Mac OS 9',
'/linux/i' => 'Linux',
'/ubuntu/i' => 'Ubuntu',
'/iphone/i' => 'iPhone',
'/ipod/i' => 'iPod',
'/ipad/i' => 'iPad',
'/android/i' => 'Android',
'/blackberry/i' => 'BlackBerry',
'/webos/i' => 'Mobile'
);
foreach ($os_array as $regex => $value) {
var_dump($regex);
var_dump($value);
if (preg_match($regex, $user_agent)) {
$os_platform = $value;
}
}
return $os_platform;
}
?>
'echo'转储变量?解释PHP并且只有在遇到错误时才会停止。至少你可以将错误本地化到代码的某个部分。但是,检测确切的错误是一个经验问题。 – nhahtdh
@nhahtdh这就是我想要做的,但我没有得到任何回报。添加了我的代码,显示我所做的回应。 –
@ChrisMirno我一直没有关注这个故事,所以可能错过了一些东西,但a)尝试使用'print_r($ var)'而不是'echo' - 对物体更好,b)如果你得到0字节的输出,通常值得检查的Apache错误日志解析/一些其他致命错误只是不被你的PHP代码处理 – Basic