提问人:n00b0101 提问时间:11/20/2009 最后编辑:informatik01n00b0101 更新时间:10/10/2020 访问量:378471
检查字符串是否以某物开头?[复制]
Check if string begins with something? [duplicate]
问:
我知道我可以看看 id 是否以某事开头,我尝试使用它,但它没有用。基本上,我正在检索一个 URL,我想为以某种方式开头的路径名设置一个类。^=
例:
var pathname = window.location.pathname; //gives me /sub/1/train/yonks/459087
我想确保对于每个以 开头的路径,我可以为元素设置一个类:/sub/1
if (pathname ^= '/sub/1') { //this didn't work...
...
答:
2赞
Piotr Rochala
11/20/2009
#1
看看 JavaScript substring()
方法。
395赞
Philip Reynolds
11/20/2009
#2
if (pathname.substring(0, 6) == "/sub/1") {
// ...
}
评论
18赞
user1071136
1/18/2013
-1:创建一个额外的冗余字符串。
9赞
Pijusn
7/21/2013
下面是一个测试用例:jsperf.com/starts-with/2 .子字符串方法似乎是我的机器上最快的方法(使用 V8)。
23赞
7/12/2015
这可以像这样变得更加通用:.这样,您就不再依赖于知道它可能变化的长度。var x = "/sub/1"; if (pathname.substring(0, x.length) === x) { // ... };
x
0赞
Martijn Scheffer
7/21/2016
创建一个新字符串,所以它并不理想,最好的方法可能是使用 charAt,如果 charAt 本身没有创建一个新字符串:)
0赞
rooby
6/10/2020
我想说的是,值得注意的是它正在创建一个字符串,但我认为不值得投票,因为没有大量明显更好的替代方案,我敢打赌,在大多数情况下,创建冗余字符串不会是一个值得担心的问题。
88赞
Cros
9/9/2011
#3
您也可以使用 string.match() 和正则表达式:
if(pathname.match(/^\/sub\/1/)) { // you need to escape the slashes
string.match()
如果找到,将返回一个匹配子字符串的数组,否则为 null。
评论
0赞
Tjorriemorrie
7/11/2013
有没有办法在expr中动态插入url字符串?例如,转义 URL 中的 /?
1赞
Cros
8/5/2013
@Tjorriemorrie 您可以使用 RegEx 类来实现此目的,例如 var reUrlTester = new RegEx(your_url_string);if(reUrlTester.test(url)) { // 使用 test-function 查看 url 是否匹配。
0赞
Kzqai
12/20/2014
@Cros 呃,你在那里打错了字,这个类实际上是“RegExp”,所以应该是:var matcher = new RegExp(expected);if(matcher.test(actual)){ return true }
0赞
Byson
12/22/2014
虽然这可行,但如果不是绝对必要,请尽量避免使用正则表达式。一个显而易见的事实是,正则表达式函数比其等效的文字字符串函数慢。事实上,速度要慢得多,以至于一些官方文档网站实际上会告诉您尽可能避免它(例如,我认为 php.net 确实如此)。我推荐 indexOf() 或 substr() 解决方案。
0赞
Trindaz
1/30/2015
match 返回一个包含匹配字符串的数组,而不是匹配的字符串。查看 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
41赞
RobKohr
1/13/2012
#4
一个可重用的功能:
beginsWith = function(needle, haystack){
return (haystack.substr(0, needle.length) == needle);
}
192赞
Ricardo Peres
2/24/2012
#5
String.prototype.startsWith = function(needle)
{
return this.indexOf(needle) === 0;
};
评论
11赞
John Magnolia
3/31/2013
-1 请参阅此处的评论,了解不使用此类实现的正当理由:stackoverflow.com/a/1978419/560287
3赞
Dilhan Jayathilake
8/7/2013
这是完美的答案(indexOf thing),而不是被标记为答案的答案。
15赞
Daniel Alder
12/30/2014
如果是 ,则此函数的性能取决于要检查的字符串的长度,对于此用例来说,这并不是预期的false
1赞
Florian Leitgeb
6/29/2015
在我看来,就内存使用和速度而言,这不是唯一正确的答案,而是最正确的答案。它也是可读的,但请记住不要修改您不拥有的对象(或者只是尽量避免它)。
1赞
Martijn Scheffer
7/21/2016
这是执行此操作的缓慢方法,比较将在整个字符串中继续进行,如果此方法被大量调用,我不会使用它。
26赞
Tim
5/18/2012
#6
首先,让我们扩展字符串对象。感谢 Ricardo Peres 的原型,我认为在使其更具可读性的上下文中使用变量“string”比使用“needle”效果更好。
String.prototype.beginsWith = function (string) {
return(this.indexOf(string) === 0);
};
然后你这样使用它。谨慎!使代码具有极强的可读性。
var pathname = window.location.pathname;
if (pathname.beginsWith('/sub/1')) {
// Do stuff here
}
评论
5赞
ratbum
9/11/2013
没有真正添加任何东西。
0赞
willy wonka
4/8/2017
恕我直言,indexOf 如果在开始时没有找到立即匹配项,则会搜索整个字符串:因此,对于要搜索的很长字符串,它的低效率会增加。
评论
/^\/sub\/1.*$/gi.test(pathname)
将返回一个布尔值作为谓词。Thou shall not modify Objects not owned!
if (pathname.indexOf('/sub/1') === 0) {//Do.}