2012-07-05 53 views
2

这个问题直接关系到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; 
} 
?> 
+0

'echo'转储变量?解释PHP并且只有在遇到错误时才会停止。至少你可以将错误本地化到代码的某个部分。但是,检测确切的错误是一个经验问题。 – nhahtdh

+0

@nhahtdh这就是我想要做的,但我没有得到任何回报。添加了我的代码,显示我所做的回应。 –

+0

@ChrisMirno我一直没有关注这个故事,所以可能错过了一些东西,但a)尝试使用'print_r($ var)'而不是'echo' - 对物体更好,b)如果你得到0字节的输出,通常值得检查的Apache错误日志解析/一些其他致命错误只是不被你的PHP代码处理 – Basic

回答

2

我试图把重点放在这个实例,而不是一般的调试,因为我敢肯定有更好的向导,让你开始。

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将暂停。在你的情况下,脚本永远不会像你的回声声明。

Bonus notes!

  • 我喜欢var_dump()检查变量,因为它是在显示一个空/空变好(回波将只打印空白),再加上它处理数组和对象。
  • 如果您发现自己正在进行大量调试,请查看运行XDebug。非常有用。
+0

好吧,这使得很多更有意义。 –

+0

我对此感到困惑的一件事是当我添加var_dumps时,我仍然看到空白的PHP文件。那么,我在哪里/如何检索var_dumps数据? –

+0

var_dump应该只是像回声一样将数据推出。你是否在问题陈述之前倾销? –