求助:如何将URL中的%20替换为短横线?附CodeIgniter代码
CodeIgniter 中将 URL 空格替换为连字符的实现方案
1. 视图层(View):生成 SEO 友好的 URL
在生成详情页链接时,使用 CodeIgniter 内置的 url_title() 函数将标题中的空格替换为连字符,同时自动处理特殊字符(可选转为小写)。
示例代码:
<!-- 循环输出服务列表时生成链接 --> <?php foreach ($services as $row): ?> <a href="<?= site_url('service-view/detail/'.$row->id.'/'.url_title($row->title, 'dash', TRUE)) ?>"> <?= $row->title ?> </a> <?php endforeach; ?>
url_title() 参数说明:
- 第一个参数:待处理的标题字符串
- 第二个参数:分隔符类型,
'dash'对应连字符- - 第三个参数:是否转为小写,
TRUE开启,FALSE保留原大小写
生成的 URL 会自动变为 http://localhost/webcodingmedia/service-view/detail/10/Jasa-SEO 格式。
2. 控制器层(Controller):处理 URL 参数
在详情页方法中,将 URL 里的连字符换回空格,匹配数据库中的原始标题(若查询依赖标题字段)。
示例代码:
class Service_view extends CI_Controller { public function detail($id, $slug) { // 将连字符还原为空格,匹配数据库原始标题 $original_title = str_replace('-', ' ', $slug); // 调用模型获取服务数据 $data['service'] = $this->service_model->get_service($id, $original_title); // 加载详情视图 $this->load->view('service_detail', $data); } }
3. 模型层(Model):适配查询逻辑
修改模型方法,接收 ID 和还原后的标题参数进行查询:
示例代码:
class Service_model extends CI_Model { public function get_service($id, $title) { $query = $this->db->get_where('services', [ 'id' => $id, 'title' => $title ]); return $query->row(); } }
额外优化:存储固定 Slug 字段(可选)
如果想提升查询效率,可在数据库新增 slug 字段,添加服务时直接生成并存储连字符格式的 slug,后续查询无需来回转换:
- 添加服务的模型代码:
public function add_service($data) { $data['slug'] = url_title($data['title'], 'dash', TRUE); return $this->db->insert('services', $data); }
- 控制器详情方法:
public function detail($id, $slug) { $data['service'] = $this->service_model->get_service_by_slug($id, $slug); $this->load->view('service_detail', $data); }
- 模型查询方法:
public function get_service_by_slug($id, $slug) { $query = $this->db->get_where('services', [ 'id' => $id, 'slug' => $slug ]); return $query->row(); }
测试验证
修改完成后,访问生成的链接,确认详情页正常加载且 URL 格式符合预期。
内容的提问来源于stack exchange,提问作者Fansyah Dwi Krisnady
相关产品推荐
相关产品推荐

