具有匹配mysql查询的URL标题

时间:2009-08-08 12:10:35

标签: php sql

我有这些信息的SQL行: 示例 - 示例(Exampleishbosh)

并非所有都有(),所以剥离

是个好主意
- and ()

out of the url然后只用SQL查询中的剩余单词进行搜索?

http://www.co.com/example_exampleish_exampleishbosh/

或者这是一个坏主意?

2 个答案:

答案 0 :(得分:3)

如果我理解正确你正在寻找一个类似slug的功能,如果是这样的话,你应该使用这个函数来“强化”ASCII字符串:

function Slugify($string)
{
    return strtolower(trim(preg_replace('~-+~', '-', preg_replace('~[^0-9a-z]~i', '-', $string)), '-'));
}

Slugify('Example - Exampleish (Exampleishbosh)'); // example-exampleish-exampleishbosh

您应该将slug存储在数据库中,并将其与请求的URL匹配。

编辑:此功能可以简化一点:

function Slugify($string)
{
    return strtolower(trim(preg_replace(array('~[^0-9a-z]~i', '~-+~'), '-', $string), '-'));
}

答案 1 :(得分:1)

由于这个问题对我来说有点不清楚,我假设信息字符串作为附加信息(如文章的标题)的关键类型,并且没有真正的GET搜索要求。

如果是这种情况,如果允许修改数据库结构,我会使用某种surrogate key代替(如数字标识符),使用title-thingy作为slug。< / p>

在这种情况下,您在网站中生成链接时,会同时获得目标的ID和slug,并以http://example.com/[id]/[slug]/格式创建其网址,例如http://example.com/213/omg-lol-the-cat-jumped/

在您的服务器中处理请求时,您只对id(“213”)感兴趣,并且slug(“omg-lol-the-cat-jumped”)仅供人类用户使用 - 标题的标签,并不影响搜索结果。您提供与id匹配的页面,而不是slug。这样,您的搜索效率很高(没有SQL LIKE匹配),并且更不容易出错(从错误格式化的slugs中进行SQL注入)。

关于如何将字符串转换为slug的(可能的?)问题,有很多方法可以解决这个问题。我只需删除所有非字母数字字符,并将字母数字块与短划线或下划线组合。您可能希望将字符串长度剪切为20个字符。