Home  >  Q&A  >  body text

php - 关于str_replace替换,如何不替换已经存在的链接内容

现在通过以下代码来替换文章中的关键词(关键词通过后台进行添加)

        //添加内链
        $innerlink = $this->model('innerlink')->all_innerlink();
        if($innerlink){
            $last_id = $this->model('innerlink')->get_last_link_id();
            for($i=0;$i<$last_id;$i++)
            {
                $title[$i] = $innerlink[$i]['title'];
                $link[$i] = '<a href='.$innerlink[$i]['description'].' target="_blank">'.$innerlink[$i]['title'].'</a>';
                $article_info['message'] = $this->model('innerlink')->str_replace_once($title[$i],$link[$i],$article_info['message']);
            }
            
        }
        //内链添加结束

模型代码如下:


    /**
     *得到内链列表
     */
    public function get_innerlink_list($where = null, $order = 'id DESC', $limit = 10, $page = null)
    {
        if ($innerlink_list = $this->fetch_page('innerlink', $where, $order, $page, $limit))
        {
            foreach ($innerlink_list AS $key => $val)
            {
                $innerlink_list[$key]['add_date'] = date("Y-m-d H:i:s",$val['add_time']);
                $innerlink_list[$key]['user'] = $this->fetch_one('users', 'user_name', "uid = '" . $this->quote($val['user_id']) . "'");
            }
        }
        
        return $innerlink_list;
    }

    /**
     * 物理删除内链
     *
     * @param  $innerlink_id
     */
    public function remove_innerlink_by_ids($innerlink_id)
    {
        if (!$innerlink_id)
        {
            return false;
        }
    
        if (is_array($innerlink_id))
        {
            $innerlink_ids = $innerlink_id;
        }
        else
        {
            $innerlink_ids[] = $innerlink_id;
        }
    
        array_walk_recursive($innerlink_ids, 'intval_string');
    
        foreach($innerlink_ids as $innerlink_id)
        {
            if (!$innerlink_info = $this->get_innerlink_by_id($innerlink_id))
            {
                continue;
            }
    
            // 删除动作
            $this->delete('innerlink', 'id = ' . intval($innerlink_id));
    
        }
    
        return true;
    }

    public function get_last_link_id()
    {
        $ids = $this->query_all('SELECT `id` FROM ' . get_table('innerlink') . ' order by add_time Desc');
        return $ids['0']['id'];
    }

function str_replace_once($needle,$replace,$haystack) {
    $pattern = '/<img[^>]*>/is';
    preg_match_all($pattern, $haystack, $matched);

        
    if(empty($matched[0])){
        $pos = strpos($haystack, $needle);
        if ($pos === false) {
            return $haystack;
        }
        return substr_replace($haystack, $replace, $pos, strlen($needle));

    } else {
        $arr = preg_split($pattern, $haystack);
        $haystack_new = '';
        $replace_time = 0;
        foreach($arr as $key => $str){
                        $pos = strpos($str, $needle);
            if ($pos === false || $replace_time > 0 || strpos($str, $needle.'</a>') !== false) {
                $haystack_new .= $str;
            } else {
                $haystack_new .= substr_replace($str, $replace, $pos, strlen($needle));
                $replace_time  = 1;
            }
            if(isset($matched[0][$key])) $haystack_new .= $matched[0][$key];
        }
        return $haystack_new;

    }
}

现在是,如果我自己添加的链接也会被替换掉(如果后台添加了这个关键词)
有没有办法直接取消对现在已经有的链接的替换
只替换没有<a >的关键词

能否直接简单处理

阿神阿神2723 days ago400

reply all(1)I'll reply

  • 巴扎黑

    巴扎黑2017-04-11 10:25:23

    你为啥老是和str_replace过不去,preg_replace有那么难吗

    reply
    0
  • Cancelreply