字符串
$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并使用数组调用该函数找到解决方案。
还对convert_url()进行了进一步的更改,因为preg_match(“#^ cid?:#”,$ url)在函数中不起作用。
/ e修饰符需要被替换/ i,因为它已被弃用。
将preg_replace替换为preg_replace_callback
$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);
}
答案 0 :(得分:0)
你在哪里写这段代码?在视图页面或控制器?如果你把这段代码写入控制器,那么需要调用这样的函数 $这 - &GT; convert_url( '$ 1')