Php mySQL存储了创建slug的函数
是否有一个mysql存储函数可以从url(或任何值)创建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
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