Preg заменить вопрос - PullRequest
       17

Preg заменить вопрос

0 голосов
/ 03 апреля 2012

У меня есть страница, где я извлекаю конкретную строку из базы данных, где имя совпадает с тем, что я ввел в URL, но я хочу, чтобы оно было оптимизировано для SEO.

Скажем, у меня есть «Печать Дэвида» в базе данных.

Я хочу иметь возможность извлечь его из базы данных, указав в URL-адресе «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 ]

3 голосов
/ 03 апреля 2012

Лучше всего хранить идентификаторы сайта, оптимизированные для SEO, или слагов , как они называются, рядом с фактическим названием вашего товара. Было бы трудно преобразовать слаг обратно в исходное название, поскольку некоторые символы теряются.

Сначала добавьте поле slug к своей таблице items и сделайте его уникальным, чтобы не было двусмысленности (поэтому у каждого элемента есть свой слаг).

Плагин генерируется всякий раз, когда элемент вставляется или обновляется, например:

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

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

Если БД выдает исключение из-за «уникального» ограничения, вы можете попытаться вставить запись несколько раз и просто добавить число в слаг.

Затем вы можете легко найти элемент, используя слаг ($name содержит часть URL, например davids-print):

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

Благодарю Madmartigan за предложение использовать url_title, который поставляется с CI.

1 голос
/ 03 апреля 2012

У меня есть расширенный класс маршрутизатора, который захочет, чтобы вы захотели.

Он проанализирует все методы контроллера и переменные, которые имеют '-', и заменит их на '_'.

Вы могли бы тогда сделать;

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]);
    }
}
...