這個問題直接關係到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