未定义的变量和未定义的索引php错误

时间:2014-09-17 20:36:25

标签: php regex

我已经完成了删除未定义变量和未定义索引错误的任务,我知道如何

$value = isset($_POST['value']) ? $_POST['value'] : '';

问题是这太费时间了,我预测超过2000个变量,$ _GET,$ _POST尚未设置。那么有一个正则表达式可以用来快速设置这些变量吗?

如何使用正则表达式将此$category = $_GET['c']更改为此

$category = isset($_GET['c']) ? $_GET['c'] : ''

我如何使用正则表达式将if($page or $category or $profile)更改为此

if(isset($page) or isset($category) or isset($profile))

这是我能想到的最好的方法,使用正则表达式查找&在Notepad ++中替换。我假设超过2000 PHP变量/索引未定义错误。如何在不关闭错误的情况下解决这个问题?

3 个答案:

答案 0 :(得分:1)

你不应该使用正则表达式,因为它有点沉重:) 如果我正确理解你的问题,你可以这样做, 使用这种方法,无论有多少参数包含POST或GET,您只需通过foreach循环过滤它们并获取带参数的干净数组,也可以使它成为返回数组的函数。然后您只需要检查{{ 1}}并做你的事。

if_array_key_exests()

没有功能

 $_POST = ["user"=>"1", "num"=>2];
 $_GET  = ["user" => '', "num"=>1];


//function method
 function filter($array)
 {
   $arr = array();

   foreach ($array as $key => $val) {

    if (!empty($val)) {
        $arr[$key] = $val;
    } 
  }

  return $arr;
}

答案 1 :(得分:0)

对于您的第一个问题,请替换

之类的内容
(\$\w+)\s*=\s*\$_GET\[['"]?(\w+)['"]?\]\s*;

通过

$1 = isset($_GET['$2']) ? $_GET['$2'] : '';

应该有用。

关于第二个问题,我不知道是否可以使用可变数量的变量。这个适用于3个变量,替换

if\s*\(\s*\s*(\$\w+)\s+or\s+(\$\w+)\s+or\s+(\$\w+)\s*\)

通过

if (isset($1) or isset($2) or isset($3))

您可以在搜索中的最后一个\s+or\s+(\$\w+)之前添加另一个\s*,并在替换4个变量等中添加另一个or isset($4)

我建议您逐个更换它们,而不是一次更换所有; - )

另请注意,if ($a)if (isset($a))不同。考虑这样的事情:

// query string is a=0
$a = $_GET['a'];
if ($a) // will be false
if (isset($a)) // will be true
if (!empty($a)) // will be false

因此,您可能希望使用!empty()代替isset()。这也应该没有通知。

答案 2 :(得分:0)

resove first issue:
define a function like:
function global_get($key){
    return isset($_GET[$key])?$_GET[$key]:'';
}

then use sed(linux tool) to replace all parts like this(it will modify all the $_GET[.*] of php extension files in your project,so be careful to use this):
find /yourproject -name "*.php" -exec sed -i "s/\$_GET\[\([^]]*\)\]/global_get(\1)/" \;

you may modify this command to apply your own demand.


The second issue could be harmful if you use the regex expression because it is hard to make a role rule.so I recommend you to replace manually.