这个问题与我在约15分钟前提出的this问题直接相关。这不是一个重复的帖子,而是希望这更像是一种学习经历。
在提出的问题中,我试图找出导致preg_match没有发现deiminator错误的原因。代码(不是我的)可用here。该错误最终导致Windows 3.11阵列中缺少'/ i'。
为了这个问题,重要的是要注意我不使用浏览器部分。
第一个问题,也是理所当然的,提出了$ regex的价值。但是,我仍然无法找到获得该值的方法。
我最初尝试的是在函数外声明一个全局变量,就在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;
}
?>
答案 0 :(得分:3)
我会尝试专注于此实例而不是一般调试,因为我确信有更好的指南可以帮助您入门。
<强> 1。查看错误消息。 大多数时候,PHP并没有太糟糕地告诉你出了什么问题以及在哪里(在几行之内)。在这种情况下,你会有类似
的内容Warning: preg_match() [function.preg-match]: No ending delimiter '/' found in /var/www/html/whatever.php on line 36
所以问题是第36行缺少斜线。第36行(属于getOS()
):
if (preg_match($regex, $user_agent)) {
我们可以推断这是$ regex的问题 - 在这个例子中,快速查看有问题的数组显示其中一行中缺少/
,但可能数据在数据库中或者可以'很容易检查。
<强> 2。开始转储变量
如果出现问题,检查变量是一个好的开始。你希望尽可能接近你的错误,所以你不知道两者之间发生了什么。我们从上面知道问题是$regex
,所以紧接在问题行之上:
var_dump($regex);
if (preg_match($regex, $user_agent)) {
新结果:
...
string '/win95/' (length=7)
string '/win16' (length=6)
Warning: preg_match() [function.preg-match]: No ending delimiter '/' found in /var/www/html/whatever.php on line 36
PHP在我们收到错误后立即停止,因此最后一个转储行将显示问题变量。你好,一个缺少斜线的正则表达式!
关于您的方法: PHP会在遇到错误时停止,这是为什么我建议尽可能地将变量转换为接近问题的部分原因。在您的情况下,脚本永远不会达到您的echo语句。
奖金说明!
var_dump()
来检查变量,因为它更好地显示一个空/ null变量(echo只会打印一个空白)加上它处理数组和对象。