2012-07-05 103 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應該只是像回聲一樣將數據推出。你是否在問題陳述之前傾銷? –