0

我有数百个具有这种结构的变量:

$bsdatA = $_POST['bsdat_a'];
$bsdatB = $_POST['bsdat_b'];

...

问题是我必须向每个函数添加 isset() 函数,如下所示:

$bsdatA = isset($_POST['bsdat_a']) ? $_POST['bsdat_a'] : '';
$bsdatB = isset($_POST['bsdat_b']) ? $_POST['bsdat_b'] : '';

...

这是在每一行上手动复制和粘贴...可以通过正则表达式完成吗?如果是的话,有人可以写下确切的公式吗?这会节省我很多时间。

非常感谢。

4

4 回答 4

2

好吧,不是正则表达式,因为我看不出这有什么帮助,但这里有一个可以大大简化编码的函数:

<?php
function postvar($index){
   return isset($_POST[$index]) ? $_POST[$index] : '';
}

$bsdatA = postvar('bsdat_a');

顺便说一句,我会postvar('bsdat_a')直接使用,而不是将结果放入变量中,因为您可能会遇到很多变量,而您只会使用一次。如果您绝对确定要将$bsdatAand$bsdatB作为局部变量,那么我建议使用循环:

<?php
foreach( range('A', 'Z') as $current ) {
   ${'bsdat'.$current} = postvar('bsdat_'.strtolower($current));
}

但是,那只是可怕:)

编辑:啊,你在谈论一个现有的脚本,你想改变它以包含很多 isset() 调用?抱歉,我没有意识到这一点。

您可以将 $_POST 替换为实现 ArrayAccess 的对象。这样,您还可以记录被调用但未使用的 POST 变量:

<?php
class PostVars implements ArrayAccess {
    protected $vars;
    public $log;

    public function __construct($vars) {
        $this->vars = $vars;
    }

    public function offsetGet($offset) {
        if(!isset($this->vars[$offset])) {
            $this->log[] = $offset;
        }
        return $this->vars[$offset];

    }

    public function offsetExists($offset) {
        return isset($this->vars[$offset]);
    }

    public function offsetSet($offset, $value) {
        // readonly.
    }

    public function offsetUnset($offset) {
        // readonly.
    }
}

$_POST = array('bsdat_a' => 'bar', 'bsdat_b' => null);

$_POST = new PostVars($_POST);

echo $_POST['bsdat_a'];
echo $_POST['bsdat_b'];
于 2012-09-21T11:49:49.210 回答
1

我假设您正在尝试使用支持 Regex Replaces 的 IDE 更改代码:

这是 Eclipse 的正则表达式:

寻找:

\$(\w+) = \$_POST\['(\w+)'\]

代替:

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

于 2012-09-21T11:53:27.297 回答
0

为 POST 变量尝试以下操作:import_request_variables('p'); 为了安全起见,最好在第二个参数中添加前缀。

于 2012-09-21T11:48:10.830 回答
0
$result = preg_replace('/\$(\w+)\s+=\s+\$_POST\[\'([^\']+)\'\];/', 
            '$\1 = isset($_POST[\'\2\']) ? $_POST[\'\1\'] : \'\';', $subject);
于 2012-09-21T11:47:44.480 回答