【问题标题】:Codeigniter 2.1 - character replaceCodeigniter 2.1 - 字符替换
【发布时间】:2012-10-26 15:58:26
【问题描述】:

我有一种感觉,有什么东西在拖我。我有这两个功能。目的是替换字符,但有些东西不起作用。文件名已更改,但只有 空格 (" ") 更改为 _ 字符(不再有 str_replace 函数)。 怎么了?

编辑 **char_replace** 位于未扩展控制器的单独库文件中。 我正在使用 char_replace 函数替换来自 input type=text 的数据并且它正在工作(正在从不同的控制器调用函数)。

function img_upload($folder) {
        $this->path = './public/img/' . $folder;
        $imgs = array();
        $config = array(
            'allowed_types' => 'jpg|jpeg|png|gif',
            'upload_path' => $this->path
        );

        $this->CI->load->library('upload', $config);

        foreach ($_FILES as $key => $value) {
            $img_name = $this->char_replace($key->name, '_');
            $config['file_name'] = $img_name;
          if($key != 'logo') :
              if (!$this->CI->upload->do_upload($key)) {
            } else {
                $q = $this->CI->upload->data();
                $config['image_library'] = 'gd2';
                $config['source_image'] = $this->path . '/' . $q['file_name'];
                $config['new_image'] = $this->path . '/thumbs';
                $config['create_thumb'] = FALSE;
                $config['maintain_ratio'] = TRUE;
                $config['width'] = 128;
                $config['height'] = 128;

                $this->CI->load->library('image_lib');
                $this->CI->image_lib->clear();
                $this->CI->image_lib->initialize($config);
                $this->CI->image_lib->resize();
                array_push($imgs, $q['file_name']);
            }
          endif;
        }

        if(empty($imgs)){
            return FALSE;
        } else {
            return implode(',', $imgs);
        }
    }

还有这个:

function char_replace($text, $rep_simbol = " ")
    {
        $char = array('!', '&', '?', '/', '/\/', ':', ';', '#', '<', '>', '=', '^', '@', '~', '`', '[', ']', '{', '}');
        return $name = str_replace($char, $rep_simbol, $text);
    }

【问题讨论】:

  • $this-&gt;char_replace() 是否调用了正确的函数?
  • 两个函数在同一个类中。我认为这是调用同一类中的函数的方式。
  • foreach ($_FILES as $key =&gt; $value) { 然后$this-&gt;char_replace($key-&gt;name, '_');$key-&gt;name 工作吗?
  • PHP 手册说要达到上传文件的名称,您需要去 $_FILES['file']['name']

标签: php codeigniter codeigniter-2


【解决方案1】:
foreach ($_FILES as $key => $value) {
  $img_name = $this->char_replace($key->name, '_');
  ...

这里$key-&gt;name 将是未定义的,因此char_replace 将返回一个空字符串。由于file_name 为空,Codeigniter Upload 库将回退到其_prep_filename 方法。

使用$value['name'] 而不是$key-&gt;name

如果您要上传多个具有相同名称的 file 字段的文件

$count = 0;
foreach ($_FILES as $filename => $values) {
  $img_name = is_array($values['name']) ? $values['name'][$count] : $values['name'];
  $img_name = $this->char_replace($img_name, '_');
  $count++;

【讨论】:

  • 如何获取上传文件的名称?
  • 更改为 $value['name'] 解决了问题:)。谢谢你的帮助:)
  • @Sasha 抱歉,如果您要上传多个文件,那将是错误的。我已经更新了我对这种情况的回答。试试看。
  • 很抱歉打扰您,但发生了一些奇怪的事情(我偶然注意到了这一点)。功能正在工作,但它只使用第一个符号(它在第一个符号之后切割符号)并且第一个之后的所有图像都具有相同的名称(添加计数以不覆盖)。如果我上传一张图片,它也在做同样的事情。这是怎么回事?
  • 已编辑代码。如果您要上传具有相同字段名称的多个文件,则较早的代码会起作用。如果上传单个文件或多个具有不同字段名称的文件是不正确的。
【解决方案2】:

我认为替换必须至少具有与搜索一样多的元素:

function char_replace($text, $rep = " ")
{
    $char = array('!', '&', '?', '/', '/\/', ':', ';', '#', '<', '>', '=', '^', '@', '~', '`', '[', ']', '{', '}');
    $replace = array($rep, $rep, $rep, $rep, %rep, $rep, $rep, $rep, $rep, $rep, $rep, $rep, $rep, $rep, $rep, $rep, $rep, $rep, $rep);
    return $name = str_replace($char, $replace, $text);
}

【讨论】:

  • 根据PHP手册,我编写代码的方式很好。我忘了说,char_replace 函数在另一个函数中使用并且它正在工作(它正在替换输入字段 type=text 中的文本)。
  • @Sasha:哦,看起来像you are right。除了如果replace 的值比search 少,那么我没有读过这句话,那么剩下的替换值将使用一个空字符串。
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 2012-10-15
  • 1970-01-01
  • 2012-09-25
  • 2012-09-11
相关资源
最近更新 更多