gpt4 book ai didi

php - 如何调试 preg_match

转载 作者:行者123 更新时间:2023-12-04 05:40:21 30 4
gpt4 key购买 nike

这个问题与this直接相关我大约 15 分钟前提出的问题。这不是要与那个帖子重复,而是希望这更多是一种学习经验。

在提出的问题中,我试图找出导致 preg_match no deliminator found 错误的原因。代码(不是我的)可用 here .该错误最终导致 Windows 3.11 数组中缺少“/i”。

重要的是要注意,为了这个问题,我不使用浏览器部分。

第一个问题提出了 $regex 的值是什么,这是理所当然的。但是,我仍然无法找到获得该值的方法。

我最初尝试的是在函数外部声明一个全局变量,并在 preg_match 行之前将全局变量设置为等于正则表达式。然后我尝试回显全局变量。我收到了一个空白页。

我还应该提到我(在询问原始问题时)删除了此代码:

$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;
}
?>

最佳答案

我会尽量专注于这个实例而不是一般的调试,因为我相信有更好的指南可以帮助您入门。

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()用于检查变量,因为它更擅长显示空/空变量(echo 只会打印一个空白)加上它处理数组和对象。
  • 如果您发现自己进行了大量调试,请查看获取 XDebug运行。非常有用。
  • 关于php - 如何调试 preg_match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11336797/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com