2014-09-17 3 views
0

Я была поставлена ​​задача, чтобы удалить неопределенную переменную и неопределенные ошибки индекса, который я знаю, какнеопределенные переменные и неопределенные ошибки индекса PHP

$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))?

Это лучший способ, который я могу придумать с помощью регулярного выражения find & заменить в Notepad ++. Я предполагаю более 2000 ошибок PHP/index undefined. Как я могу решить эту проблему без выключения ошибок?

+2

Не Regex, но простой 'для each' цикла по' $ _POST'/'$ _GET' должны работать –

ответ

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*, и добавить еще один or isset($4) в замене 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(). Это также должно работать без уведомлений.

1

вы не должны использовать регулярное выражение, потому что это своего рода тяжелый :) если я понять ваш вопрос правильно, вы можете сделать это, как это, при таком подходе, это не имеет значения, сколько параметров содержит POST или GET, вы просто фильтруете их через цикл foreach и получаете чистые массивы с параметрами, также вы можете сделать его функцией, возвращающей массив. И тогда вам просто нужно проверить 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; 
} 

без функции

$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; 
     } 
} 
+0

это работает только для параметров GET с пустые/ложные значения. Но я думаю, что его фактическая проблема заключается в том, что он выполняет * переписывание кода *, чтобы сделать код E_STRICT совместимым. Унаследованный код использует $ _GET с ключами, которые не существуют (поскольку они не передаются по строке запроса). Таким образом, любая петля также не будет закрывать эти клавиши. –

+0

Mm ... если это готовый код, ему лучше всего его полностью изменить и не тратить время на изменение каждой строки, он отлично работает с get, а также с запросами на почту. Я всегда это делаю, когда ожидаю много данных. Он может проверять функцию, если массив, который прошел, не пуст, а затем выполняет цикл foreach. И вернуть чистый массив. И после этого проверьте массив ключей для того, что он когда-либо захочет сделать, например, - построить sql с только переданными действительными данными, с операторами if. – Victorino

+0

Я думаю, что основная проблема в этом вопросе - это те сообщения, которые были «неопределенными» в 2000 году. Ваша техника работает, но если он ее использует, ему пришлось заменить 2000 'if ($ _ GET ['c'])' и аналогичным по 'if (array_key_exists ('c', $ get))', поэтому он спросил для RegEx, который он может использовать в своем текстовом редакторе. Поэтому я думаю, что намерение его вопроса состояло в основном в том, как легко заменить весь ошибочный код, а не на то, как проверять данные в запущенном приложении. –

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. 
Смежные вопросы