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

未定义变量和未定义索引php错误,php,regex,Php,Regex,我的任务是删除未定义的变量和未定义的索引错误,我知道如何删除这些错误 $value = isset($_POST['value']) ? $_POST['value'] : ''; 问题是这太费时了,我预测超过2000个变量,$\u GET,$\u POST还没有设置。有没有一个正则表达式可以用来快速设置这些变量 如何使用正则表达式将此$category=$\u GET['c']更改为此 $category=isset($\u GET['c'])$_获取['c']:'' 我如何使用regex将

我的任务是删除未定义的变量和未定义的索引错误,我知道如何删除这些错误

$value = isset($_POST['value']) ? $_POST['value'] : '';
问题是这太费时了,我预测超过2000个变量,$\u GET,$\u POST还没有设置。有没有一个正则表达式可以用来快速设置这些变量

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

$category=isset($\u GET['c'])$_获取['c']:''

我如何使用regex将($page或$category或$profile)更改为

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


这是我能想到的在记事本++中使用regex find&replace的最佳方法。我假设超过2000个PHP变量/索引未定义错误。如何在不关闭错误的情况下解决此问题?

对于第一个问题,请替换以下内容

(\$\w+)\s*=\s*\$_GET\[['"]?(\w+)['"]?\]\s*;

应该有用

关于第二个问题,我不知道在变量数量可变的情况下,这是否可行。这一个适用于3个变量,替换

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

您可以在搜索中的最后一个
\s*
之前添加另一个
\s+或\s+(\$\w+)
,并在替换4个变量时添加另一个
或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

所以,也许您想使用
!空()
而不是
isset()
。这也应该在没有通知的情况下工作。

您不应该使用正则表达式,因为它有点重:) 如果我没弄错你的问题你可以这样做, 使用这种方法,不管有多少个参数包含POST或GET,您只需通过foreach循环过滤它们,并获得带有参数的干净数组,还可以将其作为返回数组的函数。然后,您只需检查
if\u array\u key\u 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;
}
无功能

 $post = array();
 foreach ($_POST as $key => $val) {
        if (!empty($val)) {
            $post[$key] = $val;
        }
 }

 $get = array();
 foreach ($_GET as $key => $val) {
         if (!empty($val)) {
             $get[$key] = $val;
         }  
 }

不是正则表达式,而是对
$\u POST
/
$\u GET
上的每个循环使用一个简单的
。这只适用于具有空/falsy值的GET参数。但我认为他的实际问题是,他进行了代码重写,使代码E_严格兼容。遗留代码使用$\u GET和不存在的键(因为它们不是通过查询字符串传递的)。所以,任何循环都不会覆盖这些键。嗯。。。如果这是现成的代码,他最好完全改变他,而不是浪费时间去改变每一行,它在get和post请求中工作得非常完美。当我需要大量数据时,我总是这样做。若传递的数组不是空的,他可以检入函数,然后执行foreach循环。并返回干净的数组。然后检查数组键,看看他到底想做什么,例如,用只传递的有效数据和if语句构建sql。我认为问题的主要问题是那些2000个“未定义”的通知。你的技术是可行的,但是如果他使用它,他必须用if($\u-GET['c'])
替换2000
if($\u-GET['c'])
,类似的替换方法是if(array\u-key\u-exists('c',$GET)),这就是为什么他需要一个可以在文本编辑器中使用的正则表达式。因此,我认为他的问题主要是如何轻松地替换所有错误代码,而不是如何验证正在运行的应用程序中的数据。
 $_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;
}
 $post = array();
 foreach ($_POST as $key => $val) {
        if (!empty($val)) {
            $post[$key] = $val;
        }
 }

 $get = array();
 foreach ($_GET as $key => $val) {
         if (!empty($val)) {
             $get[$key] = $val;
         }  
 }
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.