Preg_replace问题

时间:2012-04-03 12:34:16

标签: php mysql codeigniter preg-replace

我有一个页面,我从数据库中提取一个特定的行,其中的名称等于我在URL中的位置,但我希望它对SEO友好。

所以说我在数据库中有“David's Print”。

我希望能够通过在网址中添加“davids-print”来从数据库中提取

我正在使用Codeigniter作为我的框架。

如果我需要更好地解释,请告诉我

目前我正在使用

public function item($name)
{
    $this->data['item'] = $this->db->get_where('items', array('name' => str_replace("-", " ", $name)))->result_array();
    $this->layouts->view('databases/items/single', $this->data);
}

但当然这仅适用于空间

2 个答案:

答案 0 :(得分:3)

最好将SEO友好的网站ID或slugs存储在您商品的实际标题旁边。由于某些字符丢失,很难将slug转换回原始标题。

首先将slug字段添加到您的items表中并使其唯一,这样就不存在歧义(因此每个项目都有自己的slug)。

每当插入或更新项目时都会生成slug,例如:

$this->title = $_POST['title'];
$this->slug = url_title($this->title, 'dash', TRUE);

$this->db->insert('items', $this);

如果数据库由于“唯一”约束而抛出异常,您可以尝试多次插入记录,只需向slug添加一个数字。

然后您可以使用slug轻松搜索该项目($name包含类似davids-print的网址部分):

$this->data['item'] = $this->db->
    get_where('items', array('slug' => $name))->result_array();

感谢Madmartigan建议使用CI附带的url_title

答案 1 :(得分:1)

我有一个扩展的路由器类,你想要它。

它将解析任何带有' - '的控制器方法和变量,并用'_'替换它们。

然后你可以做;

public function item($name)
{
    $this->data['item'] = $this->db->get_where('items', array('name' => str_replace("_", " ", $name)))->result_array();
    $this->layouts->view('databases/items/single', $this->data);
}

类( MY_Router.php )需要放在 application / core 中(请注意类扩展名)。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Router extends CI_Router {

    function set_class($class) {
        $this->class = str_replace('-', '_', $class);
    }

    function set_method($method) {
        $this->method = str_replace('-', '_', $method);
    }

    function _validate_request($segments) {
        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).EXT)) {
            return $segments;
        }
        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0])) {       
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            if (count($segments) > 0) {
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).EXT)) {
                    show_404($this->fetch_directory().$segments[0]);
                }
            } else {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        // Can't find the requested controller...
        show_404($segments[0]);
    }
}