Php mySQL存储了创建slug的函数

Php mySQL存储了创建slug的函数,php,mysql,function,Php,Mysql,Function,是否有一个mysql存储函数可以从url(或任何值)创建slug 因此,我的问题可以是: SELECT *, SLUG(url) FROM clients 我不确定我是否建议在SQL中这样做,但这里有一个人为您创建了一个名为“slugify”的函数: 我从 并将其修改为在开头不包含“-”(我们将“$”作为第一个字符) 以下是我的结果: DROP FUNCTION IF EXISTS `slugify`; DELIMITER ;; CREATE DEFINER=`root`@`localhos

是否有一个mysql存储函数可以从url(或任何值)创建slug

因此,我的问题可以是:

SELECT *, SLUG(url) FROM clients

我不确定我是否建议在SQL中这样做,但这里有一个人为您创建了一个名为“slugify”的函数:

我从

并将其修改为在开头不包含“-”(我们将“$”作为第一个字符)

以下是我的结果:

DROP FUNCTION IF EXISTS `slugify`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost`
FUNCTION `slugify`(dirty_string varchar(200))
RETURNS varchar(200) CHARSET latin1
DETERMINISTIC
BEGIN
    DECLARE x, y , z Int;
    Declare temp_string, allowed_chars, new_string VarChar(200);
    Declare is_allowed Bool;
    Declare c, check_char VarChar(1);

    set allowed_chars = "abcdefghijklmnopqrstuvwxyz0123456789-";
    set temp_string = dirty_string;

    Select temp_string Regexp('&') Into x;
    If x = 1 Then
        Set temp_string = replace(temp_string, '&', ' and ');
    End If;

    Select temp_string Regexp('[^a-z0-9]+') into x;
    If x = 1 then
        set z = 1;
        While z <= Char_length(temp_string) Do
            Set c = Substring(temp_string, z, 1);
            Set is_allowed = False;
            Set y = 1;
            Inner_Check: While y <= Char_length(allowed_chars) Do
                If (strCmp(ascii(Substring(allowed_chars,y,1)), Ascii(c)) = 0) Then
                    Set is_allowed = True;
                    Leave Inner_Check;
                End If;
                Set y = y + 1;
            End While;
            If is_allowed = False Then
                Set temp_string = Replace(temp_string, c, '-');
            End If;

            set z = z + 1;
        End While;
    End If;

    Select temp_string Regexp("^-|-$|'") into x;
    If x = 1 Then
        Set temp_string = Replace(temp_string, "'", '');
        Set z = Char_length(temp_string);
        Set y = Char_length(temp_string);
        Dash_check: While z > 1 Do
            If Strcmp(SubString(temp_string, -1, 1), '-') = 0 Then
                Set temp_string = Substring(temp_string,1, y-1);
                Set y = y - 1;
            Else
                Leave Dash_check;
            End If;
            Set z = z - 1;
        End While;
    End If;

    Repeat
        Select temp_string Regexp("--") into x;
        If x = 1 Then
            Set temp_string = Replace(temp_string, "--", "-");
        End If;
    Until x <> 1 End Repeat;

    If LOCATE('-', temp_string) = 1 Then
        Set temp_string = SUBSTRING(temp_string, 2);
    End If;

    Return temp_string;
END;;
DELIMITER ;
DROP函数(如果存在)`slugify`;
分隔符;;
CREATE DEFINER=`root`@`localhost`
函数“slugify”(脏字符串varchar(200))
返回varchar(200)字符集1
确定性
开始
声明x,y,z Int;
声明临时字符串、允许字符、新字符串VarChar(200);
申报是允许的;
声明c,检查_char VarChar(1);
设置允许的字符=“abcdefghijklmnopqrstuvwxyz012456789-”;
设置温度字符串=脏字符串;
选择temp_字符串Regexp('&')进入x;
如果x=1,则
设置临时字符串=替换(临时字符串“&”、“and”);
如果结束;
选择临时字符串Regexp(“[^a-z0-9]+”)到x中;
如果x=1,则
设置z=1;

虽然z我在robertpost函数中添加了一些行,以确保slug始终是唯一的

这正好在函数结束之前,如下面所示。确保指示的表名不带括号[]

    SELECT COUNT(*) INTO i FROM [table name goes here] WHERE slug LIKE CONCAT('%',temp_string,'%');
    If i > 0 Then
        Set temp_string = CONCAT(temp_string,'-',i+1);
    End If;

    Return temp_string;
END;;
DELIMITER ;

这是罗伯特·罗斯答案的改进版本。它的速度要快得多,因为它避免了在所有允许的字符之间循环,而只是通过比较ASCII码进行检查

DROP函数(如果存在)`slugify`;
分隔符;;
CREATE DEFINER=`root`@`localhost`
函数“slugify”(脏字符串varchar(200))
返回varchar(200)字符集1
确定性
开始
声明x,y,z Int;
声明临时字符串、新字符串VarChar(200);
申报是允许的;
声明c,检查_char VarChar(1);
设置温度字符串=较低(脏字符串);
设置临时字符串=替换(临时字符串“&”、“and”);
选择临时字符串Regexp(“[^a-z0-9\-]+”)到x中;
如果x=1,则
设置z=1;
z=48,ascii(c)=97,ascii(c)1
如果Strcmp(子字符串(临时字符串,-1,1),“-”)=0,则
设置临时字符串=子字符串(临时字符串,1,y-1);
设置y=y-1;
其他的
离开破折号检查;
如果结束;
设置z=z-1;
结束时;
如果结束;
重复
选择temp_字符串Regexp(“--”)到x中;
如果x=1,则
设置临时字符串=替换(临时字符串“--”、“-”;
如果结束;
直到x1结束重复;
如果LOCATE('-',temp_string)=1,则
设置临时字符串=子字符串(临时字符串,2);
如果结束;
返回临时字符串;
完;;;
定界符;

我已经实现了我自己的slug函数,支持重音字符,欢迎对其做出任何贡献


请在github上或此处随意发布任何建议、错误或任何问题或贡献,但github更好

我已经使用此代码很长时间了。在这里发帖是为了纪念和帮助现在的人

只需在MySQL查询选项卡中复制/粘贴此代码段并运行它

--假设您的用户是root,主机是localhost。如果不是,请更改根用户和本地主机值以匹配您的值

CREATE DEFINER=`root`@`localhost` FUNCTION `toSlug`(
    `s` NVARCHAR(500)
)
RETURNS varchar(500) CHARSET utf8
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(LOWER(TRIM(s)), 
':', ''), ')', ''), '(', ''), ',', ''), '\\', ''), '/', ''), '"', ''), '?', ''),
"'", ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-'),'ù','u'),
'ú','u'),'û','u'),'ü','u'),'ý','y'),'ë','e'),'à','a'),'á','a'),'â','a'),'ã','a'), 
'ä','a'),'å','a'),'æ','a'),'ç','c'),'è','e'),'é','e'),'ê','e'),'ë','e'),'ì','i'),
'í','i'),'ě','e'), 'š','s'), 'č','c'),'ř','r'), 'ž','z'), 'î','i'),'ï','i'),'ð','o'),
'ñ','n'),'ò','o'),'ó','o'),'ô','o'),'õ','o'),'ö','o'),'ø','o'),'%', '')
它将创建一个您可以调用的函数,如:

UPDATE my_table set my_new_slug_column = toSlug(my_any_column_id_like_to_slug);
它将获得
my\u any\u column\u id\u like\u to\u slug
值,并在表
my\u table
中重写/复制到
my\u new\u slug\u column

您还可以将包含文本的列转换为类似于slug的列:

UPDATE my_table set my_column = toSlug(my_column);
此案例将更新my_栏本身,例如,“Oh my gosh”将是“Oh my gosh”

我的两分钱:

创建函数slugify(str VARCHAR(255))
返回VARCHAR(255)
语言SQL
确定性
无SQL
SQL安全调用程序
开始
声明slug,允许\u chars VARCHAR(255);
声明当前_char VARCHAR(1);
声明pos、len INT;
--在此处添加自定义替换
替换(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换(替换)(替换)(替换)(替换)(替换)(替换)(下部(装饰)(str))、‘ú’、‘u’、‘ç’、‘c’、‘ğ’、‘g’、‘-’、‘e’、‘è’、‘e’、‘e’、‘e’)“e”方面的,”他们,”他们,”他们,”他们,”他们,”他们,”,”他们,”他们,”他们;
设置pos=1;
设置长度=字符长度(段塞);
设置允许的字符='abcdefghijklmnopqrstuvwxyz0123456789-';
--删除不允许的字符
而0号位置是
设置段塞=替换(段塞,'-','-');
结束时;
回流段塞;
结束;

在音译的帮助下,可能会在多种语言上重复使用。我发现他的解决方案看起来并不吸引人。。。也许我可以从中吸取一些想法。你为什么不建议呢?我认为在应用层实现会更容易,在你的例子中,用PHP。至少对我来说是这样。我不是SQL高手。对于数据格式化(基本上就是这样),我喜欢让数据的使用者自己决定。您还应该做一些速度测试,看看哪种方法更有效。我认为这将决定哪种方法适合您的情况。是的,这就是我实际正在做的,试图找到一些基准数字并从中做出决定。可能逻辑不在PHP或Wordpress中,这是在大规模SQL处理中。仅为此创建一行一行的PHP例程会很尴尬。原始的PHP例程会出现错误-这一个是从复制/粘贴grin中产生的-谢谢,它为我删除了第一个字符。当传入两个单词(新西兰)时,上面的函数有问题。T