Уникальные слаги, которые, если подходят к slug-1, slug-2 slug-n

Я использую только слаг для идентификации страницы на веб-сайте, например: example.tld/view/this-fancy-slug. Это генерируется из заголовка автоматически с помощью этой функции:

public static function Normalize($str)
{
    $charset = "UTF-8";
    $separator = "-";

    $str = strtolower(htmlentities($str, ENT_COMPAT, $charset));
    $str = preg_replace('/&(.)(acute|cedil|circ|lig|grave|ring|tilde|uml);/', "$1", $str);
    $str = preg_replace('/([^a-z0-9]+)/', $separator, html_entity_decode($str, ENT_COMPAT, $charset));
    $str = trim($str, $separator);

    return $str;
}

Это возвращает идеальный слаг... но мне нужны уникальные слаги. Поэтому я должен объединиться с mysql, чтобы проверить, существует ли слаг, который соответствует созданному. Нет проблем с этим.

Проблема в том, что я хочу добавить -1 в финал, если есть ОДИН слаг. Но может быть ошибка, если добавить 3 одинаковых слага, так что... как мне управлять этим, чтобы перейти от slug, slug-1, slug-2, slug-3... slug-100, slug-n?

Заранее спасибо!


person ipalaus    schedule 05.10.2010    source источник


Ответы (1)


Не просто проверяйте, присутствует ли этот идентичный слаг. Используйте регулярное выражение для подсчета всех слагов, следующих шаблону /(<base-regex-for-slug>)(-\d+)?/. Поскольку вы разрешаете только буквенно-цифровые символы, ваше базовое регулярное выражение выше будет самим слагом.

person Alin Purcaru    schedule 05.10.2010
comment
Эта функция дает мне только заголовок-как-слаг. В другой части, запросы MySQL, я должен это проверить. Я не знаю, как это сделать: проверьте, возвращает ли slug значение true, если возвращает, проверьте, какое последнее число (NULL, -1, -2...). - person ipalaus; 05.10.2010
comment
Именно на это я и ответил. Сделайте так, чтобы функция возвращала количество использований слага. Для этого вы не проверяете точное совпадение в SQL (LIKE или =), а проверяете шаблон регулярного выражения (RLIKE). dev.mysql.com/doc/refman/5.1/en/ regexp.html#operator_regexp - person Alin Purcaru; 05.10.2010
comment
Я не знал о RLIKE! Благодарю вас! :) - person ipalaus; 05.10.2010
comment
Извините, Алин, у меня возникли некоторые проблемы с реализацией. Можете вы помочь мне? У меня есть две записи: lorem и lorem-1 (как news.slug). Я использую: SELECT id,slug FROM news WHERE slug RLIKE '/(lorem)(-\d+)?/' и возвращает мне 0 строк. Я не правильно делаю? Заранее спасибо! - person ipalaus; 05.10.2010