【问题标题】:Call a function from preg_replace in codeigniter在 codeigniter 中从 preg_replace 调用函数
【发布时间】:2016-03-06 13:56:04
【问题描述】:

字符串

$string = '<img width="624" height="36" id="Picture_x0020_3" src="cid:image002.png@01D12C22.B28006A0" alt="cid:image003.png@01CFBD71.8CD95080">';

函数

final_content = preg_replace('~src=["]([^"]+)["]~e', "'src=\"data/'.convert_url('$1') . '\"'", $string);
function convert_url($url)
{
    if (preg_match("#^cid?:#", $url)) {
        $url = parse_url($url, PHP_URL_PATH);
    }
    $url2 = substr($url, 0, strpos($url, "@"));
    $url2 = 'data/143-'.$url2;
    return basename($url2);
}

我想用上面提到的字符串替换图像源。

实际模式:src="cid:image002.png@01D12C22.B28006A0"

替换:src="data/image002.png"

该脚本在普通 PHP 代码中运行良好,但由于我使用的是 CodeIgnitor,因此无法以传统方式调用该函数。

分析了很多答案后发现用preg_replace_callback代替。

在 CodeIgnitor 中使用 preg_replace_callback():

$final_content = preg_replace_callback(
            '~src=["]([^"]+)["]~',
            array($this, 'convert_url'),
            $string);

CodeIgnitor 的功能:

function convert_url($matches)
    {
        if (preg_match("#^cid?:#", $matches[1])) {
            $url = parse_url($matches[1], PHP_URL_PATH);
        }
        $url2 = substr($url, 0, strpos($url, "@"));
        $url3 = 'src=\"data/'.$url2.'\"';
        return basename($url3);
    }

该功能包括替换模式(即 'cid:' 与 'data/143-')以及修剪内容(即 @ 之后)。


找到解决方案:

通过 preg_replace_callback 更改 preg_replace 找到解决方案,并使用数组调用函数。

由于 preg_match("#^cid?:#", $url) 在函数中不起作用,因此还对 convert_url() 进行了进一步更改。

/e 修饰符需要替换 /i,因为它已被弃用。

用 preg_replace_callback 替换 preg_replace

 $final_content = preg_replace_callback(
            '~src=["]([^"]+)["]~i',
            array($this, 'convert_url'),
            $string2);

从函数中移除 preg_replace 并使用不同的技术来提取字符串。

function convert_url($matches)
    {
        $url = $matches[0];
        $url2 = $this->get_string_between($url,'src="cid:','@');
        $urls = "'$GLOBALS[id]-$url2'";
        $url4 = 'onclick="open_img('.$urls.')" src="data/'.$GLOBALS['id'].'-'.$url2.'"';    
        return strtolower($url4);
    }
    
    function get_string_between($string,$start,$end){
        $string = " ".$string;
        $ini = strpos($string,$start);
        if ($ini == 0) return "";
        $ini += strlen($start);
        $len = strpos($string,$end,$ini) - $ini;
        return substr($string,$ini,$len);
    }

【问题讨论】:

    标签: php codeigniter preg-replace preg-replace-callback


    【解决方案1】:

    您在哪里编写此代码?在视图页面或控制器中?如果您将此代码写入控制器,则需要调用这样的函数 $this->convert_url('$1').

    【讨论】:

    • 我正在控制器中编写此代码。是的,我尝试在 preg_replace() 中使用 $this->convert_url('$1')。它仍然将 convert_url() 显示为未定义的函数。
    猜你喜欢
    • 2011-01-06
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多