如何在 jQuery 中将标题转换为 URL slug?
我正在 CodeIgniter 中开发一个应用程序,并且尝试在表单上创建一个字段来动态生成 URL slug。 我想做的是删除标点符号,将其转换为小写,然后用连字符替换空格。 例如,Shane's Rib Shack 将变成 shanes-rib-shack。
这是我到目前为止所拥有的。 小写部分很简单,但替换似乎根本不起作用,而且我不知道删除标点符号:
$("#Restaurant_Name").keyup(function() {
var Text = $(this).val();
Text = Text.toLowerCase();
Text = Text.replace('/\s/g','-');
$("#Restaurant_Slug").val(Text);
});
I'm working on an app in CodeIgniter, and I'm trying to make a field on a form dynamically generate the URL slug. What I'd like to do is remove the punctuation, convert it to lowercase, and replace the spaces with hyphens. So for example, Shane's Rib Shack would become shanes-rib-shack.
Here's what I have so far. The lowercase part was easy, but the replace doesn't seem to be working at all, and I have no idea to remove the punctuation:
$("#Restaurant_Name").keyup(function() {
var Text = $(this).val();
Text = Text.toLowerCase();
Text = Text.replace('/\s/g','-');
$("#Restaurant_Slug").val(Text);
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(28)
你所需要的只是一个加号:)
All you needed was a plus :)
注意:如果您不关心反对已接受答案的论点,而只是寻找答案,请跳过下一部分,您会在最后找到我建议的答案
已接受的答案有一个几个问题(在我看来):
1)至于第一个函数片段:
不考虑多个连续的空格
输入:
它是一个好的slug
收到:
- --is---it---a---good---slug---
预期:
is-it-a-good-slug
不考虑多个连续破折号
输入:
-----is-----it-----a-----good-----slug-----
收到:
-----is-----it-----a-----good-----slug-----
预期:
is-it-a-good-slug
请注意,此实现不处理外部破折号(或空格),无论它们是多个连续的字符还是单个字符(据我了解,并且它们的用法)无效
2)至于第二个函数片段:
它通过将多个连续的空格转换为单个
-
来处理它们,但这还不够作为外部(在函数的开头和结尾)字符串)空格的处理方式相同,因此is it a good slug
会返回-is-it-a-good-slug-
它还会从输入中完全删除破折号将
--is--it--a--good--slug--'
转换为isitagoodslug
,@ryan-allen 评论中的代码片段会照顾到其中,外部破折号问题尚未解决,尽管现在我知道没有标准定义,并且接受的答案可能会完成工作(发布问题的用户正在寻找的工作),但这是最受欢迎的关于 JS 中的 slugs 的问题,所以必须指出这些问题(关于完成工作!)想象一下输入这个令人厌恶的 URL(
www.blog.com/posts /-----how-----to-----slugify-----a-----string-----
) 或者甚至只是重定向到它而不是类似(www.blog.com/posts/how-to-slugify-a-string
),我知道这是一个极端的情况,但这就是测试的目的。在我看来,更好的解决方案如下:
现在可能有一个 RegExp ninja 可以将其转换为单行表达式,我不是 RegExp 专家,我并不是说这是最好或最紧凑的解决方案或具有最佳性能的解决方案但希望它能完成工作。
Note: if you don't care about an argument against the accepted answer and are just looking for an answer, then skip next section, you'll find my proposed answer at the end
the accepted answer has a few issues (in my opinion):
1) as for the first function snippet:
no regard for multiple consecutive whitespaces
input:
is it a good slug
received:
---is---it---a---good---slug---
expected:
is-it-a-good-slug
no regard for multiple consecutive dashes
input:
-----is-----it-----a-----good-----slug-----
received:
-----is-----it-----a-----good-----slug-----
expected:
is-it-a-good-slug
please note that this implementation doesn't handle outer dashes (or whitespaces for that matter) whether they are multiple consecutive ones or singular characters which (as far as I understand slugs, and their usage) is not valid
2) as for the second function snippet:
it takes care of the multiple consecutive whitespaces by converting them to single
-
but that's not enough as outer (at the start and end of the string) whitespaces are handled the same, sois it a good slug
would return-is-it-a-good-slug-
it also removes dashes altogether from the input which converts something like
--is--it--a--good--slug--'
toisitagoodslug
, the snippet in the comment by @ryan-allen takes care of that, leaving the outer dashes issue unsolved thoughnow I know that there is no standard definition for slugs, and the accepted answer may get the job (that the user who posted the question was looking for) done, but this is the most popular SO question about slugs in JS, so those issues had to be pointed out, also (regarding getting the job done!) imagine typing this abomination of a URL (
www.blog.com/posts/-----how-----to-----slugify-----a-----string-----
) or even just be redirected to it instead of something like (www.blog.com/posts/how-to-slugify-a-string
), I know this is an extreme case but hey that's what tests are for.a better solution, in my opinion, would be as follows:
now there is probably a RegExp ninja out there that can convert this into a one-liner expression, I'm not an expert in RegExp and I'm not saying that this is the best or most compact solution or the one with the best performance but hopefully it can get the job done.
*基于 https://gist.github.com/mathewbyrne/1280286
现在你可以转换它string:
into:
应用于您的代码:
*based on https://gist.github.com/mathewbyrne/1280286
now you can transform this string:
into:
applying to your code:
我创建了一个在大多数语言中实现的插件:http://leocaseiro。 com.br/jquery-plugin-string-to-slug/
默认用法:
非常简单有 stringToSlug jQuery 插件
I create a plugin to implement in most of languages: http://leocaseiro.com.br/jquery-plugin-string-to-slug/
Default Usage:
Is very easy has stringToSlug jQuery Plugin
对于已经使用
lodash
的人这些示例中的大多数都非常好并且涵盖了很多案例。 但如果你“知道”你只有英文文本,这是我的版本,非常容易阅读:)
_.words(_.toLower(text)).join('-')
For people already using
lodash
Most of these example are really good and cover a lot of cases. But if you 'know' that you only have English text, here's my version that's super easy to read :)
_.words(_.toLower(text)).join('-')
这对我来说很好。
在 CodeSnipper
this works for me fine.
Found it on CodeSnipper
这段代码正在运行
This code is working
好吧,读完答案后,我想出了这个。
Well, after reading the answers, I came up with this one.
您可以为此使用自己的函数。
尝试一下:http://jsfiddle.net/xstLr7aj/
You can use your own function for this.
try it: http://jsfiddle.net/xstLr7aj/
您可能想看看 speakingURL 插件,然后您就可以:
You may want to take a look at the speakingURL plugin and then you just could:
纯 JavaScript 上更强大的 slug 生成方法。 它基本上支持所有西里尔字符和许多元音变音(德语、丹麦语、法国、土耳其语、乌克兰语等)的音译,但可以轻松扩展。
More powerful slug generation method on pure JavaScript. It's basically support transliteration for all Cyrillic characters and many Umlauts (German, Danish, France, Turkish, Ukrainian and etc.) but can be easily extended.
接受的答案不满足我的需求(它允许下划线,不处理开头和结尾的破折号等),其他答案还有其他不适合我的用例的问题,所以这是 slugify 函数我想出了:
这会将“foo!!!BAR_-_-_baz-”(注意开头的空格)变成
foo-bar-baz
。The accepted answer didn't meet my needs (it allows underscores, doesn't handle dashes at the beginning and end, etc.), and the other answers had other issues that didn't suit my use case, so here's the slugify function I came up with:
This will turn ' foo!!!BAR_-_-_baz-' (note the space at the beginning) into
foo-bar-baz
.还有一个。 简短并保留特殊字符:
imaginação é mato => 想象
Yet another one. Short and keeps special characters:
imaginação é mato => imaginacao-e-mato
有一天,我醒来,想用 javascript 编写一个完美的
slugify
函数,该函数将提供与 Wordpress 清理标题相同的结果(多么糟糕的名字,清理标题,顺便说一句),然后继续与我的生命。我四处窥探,看到了很多解决方案(可能没有特殊原因就太复杂了),修改了我多年来使用的解决方案(太简单并且浪费了很多时间)。 我也研究过Wordpress代码,没有评论。
我还找到了 Sal 的帖子。 他的代码很酷,但对我来说太复杂了。 最重要的是,他的帖子包含一个非常重要的东西,他用于测试的数据表。
所以我坐下来想出了这个:
通过 Jest 使用我从 Sal 中提取的数据集进行验证发布。
您可以在小提琴 https://jsfiddle.net/stamat/vq14dL5z/ 中查看它的功能
您可以在我的小型 ESM 库中找到此函数 https://github.com/stamat /book-of-spells 采用 NPM/YARN 包
book-of-spells
的形式。 这是我的 JS 片段库,如果您认为合适,请贡献并随意使用其中的任何部分!感谢 Sal Ferrarello 和你们所有人提供的小线索并帮助我提出解决方案。 感谢大家!
One day I woke up and I wanted to write of a perfect
slugify
function in javascript that will provide the same result as Wordpress sanitize title (what a terrible name, sanitize title, btw), and just get on with my life.I've snooped around, seen a lot of solutions (which are maybe too complex for no particular reason), revised my solution that I was using for years (which was too simple and sucked big time). I've also looked into Wordpress code, no comment.
I've also found the Sal's post. His code was cool but too complex for my taste. Most importantly his post contained one very important thing, a table of data that he used for testing.
So I sat down and came up with this:
Validating it through Jest with a data set I've extracted from Sal's post.
You can see it in function in the fiddle https://jsfiddle.net/stamat/vq14dL5z/
You can find this function as a part of my small ESM library https://github.com/stamat/book-of-spells in form of a NPM/YARN package
book-of-spells
. It's a library of my JS snippets, please do contribute if you see fit and feel free to use any part of it!Thanks to Sal Ferrarello and all of you for providing little clues and helping me come up with my solution. Thanks everyone!
这帮助我解决了同样的问题!
This helped me with the same problem !
我过滤了两次,因为由于一些不需要的字符,可以放入更多 -
I filtered it twice because more - could be put in because of some unwanted characters
塔兰蒂尼答案的扩展版本 - https://stackoverflow.com/a/5782563/14431043
A bit extended version of Taranttini answer - https://stackoverflow.com/a/5782563/14431043
这是实际的解决方案
This is the actual solutions
我不知道“蛞蝓”一词从何而来,但我们开始吧:
第一个
replace
方法会将空格更改为连字符,第二个,replace 会删除除字母数字、下划线或连字符之外的所有内容。如果你不希望“like - this”变成“like---this”,那么你可以使用这个:
这将在第一次替换时删除连字符(但没有空格),在第二次替换中它将把连续的空格压缩为单个连字符。
所以“like - this”就变成了“like-this”。
I have no idea where the 'slug' term came from, but here we go:
The first
replace
method will change spaces to hyphens, second, replace removes anything not alphanumeric, underscore, or hyphen.If you don't want things "like - this" turning into "like---this" then you can instead use this one:
That will remove hyphens (but no spaces) on the first replace, and in the second replace it will condense consecutive spaces into a single hyphen.
So "like - this" comes out as "like-this".
并尝试
原始: http://dense13.com /blog/2009/05/03/converting-string-to-slug-javascript/
编辑:
扩展为更多语言特定字符:
and try
original by: http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/
EDIT:
extended for more language specific chars:
首先,正则表达式不应该有引号,所以 '/\s/g' 应该是 /\s/g
以便替换所有非字母数字字符使用破折号,这应该可以工作(使用您的示例代码):
这应该可以解决问题......
First of all, regular expressions should not have surrounding quotes, so '/\s/g' should be /\s/g
In order to replace all non-alphanumerical characters with dashes, this should work (using your example code):
That should do the trick...
希望这可以拯救某人的一天......
Hope this can save someone's day...
将此处答案中的各种元素与标准化相结合可以提供良好的覆盖范围。 保持操作顺序以增量清理 url。
normlize('NFD')
将重音字符分解为其组成部分,即基本字母加上变音符号(重音部分)。replace(/[\u0300-\u036f]/g, "")
清除所有变音符号,保留基本字母本身。 其余部分通过内联注释进行解释。Combining a variety of elements from the answers here with normalize provides good coverage. Keep the order of operations to incrementally clean the url.
normlize('NFD')
breaks accented characters into their components, which are basic letters plus diacritics (the accent part).replace(/[\u0300-\u036f]/g, "")
purges all the diacritics, leaving the basic letters by themselves. The rest is explained with inline comments.我找到了一个很好且完整的英语解决方案
它的一些使用示例:
感谢 Andrew Stewart
I found a good and complete solution for English
Some examples of it in use:
Thanks to Andrew Stewart
看一下这个 slug 函数来清理 URL,它由 Sean Murphy 开发,位于 https://gist.github.com /sgmurphy/3095196
Take a look at this slug function to sanitize URLs, developed by Sean Murphy at https://gist.github.com/sgmurphy/3095196