JavaScript对应于PHP中的Explode()函数

389

我有这个字符串:

0000000020C90037:TEMP:data

我需要这个字符串:

TEMP:data.

使用PHP,我会这样做:

$str = '0000000020C90037:TEMP:data';
$arr = explode(':', $str);
$var = $arr[1].':'.$arr[2];

我怎么在JavaScript中有效地实现像PHP中explode函数的功能?

17个回答

652

这是直接从您的PHP代码转换而来:

//Loading the variable
var mystr = '0000000020C90037:TEMP:data';

//Splitting it with : as the separator
var myarr = mystr.split(":");

//Then read the values from the array where 0 is the first
//Since we skipped the first element in the array, we start at 1
var myvar = myarr[1] + ":" + myarr[2];

// Show the resulting value
console.log(myvar);
// 'TEMP:data'

77
请注意,数组起始位置为[0]。 - Herr
55
@Herr Kaleun...明白了,但是OP想要数组中的最后两项。 - John Hartsock
4
没问题,以下是您需要翻译的内容:+1:没错,这里有一个来自 MDN 的链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/split。如果要反过来操作,也就是 PHP 中的 implode() 函数在 JavaScript 中的等价物是 myArray.join(':'):https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/join。 - Sk8erPeter
15
注意:split(delimiter,limit)limit 参数不能像 explode($delimiter,$string,$limit)limit 参数一样工作。例如:explode('.','1.2.3.4',3) === array('1','2','3.4') - 而在 JavaScript 中,你将得到:'1.2.3.4'.split('.',3) === ['1', '2', '3']。有人知道如何轻松复制 PHP 的方法吗? (说明:本文是针对一段编程问题的翻译,涉及两种编程语言中对于字符串的处理函数的差异及如何解决该问题) - Nathan J.B.
1
我已经添加了代码注释来澄清数组[0]的内容,这可能会让新手感到困惑... - NDM
显示剩余5条评论

53
String.prototype.explode = function (separator, limit)
{
    const array = this.split(separator);
    if (limit !== undefined && array.length >= limit)
    {
        array.push(array.splice(limit - 1).join(separator));
    }
    return array;
};

应该完全模仿 PHP 的 explode() 函数。

'a'.explode('.', 2); // ['a']
'a.b'.explode('.', 2); // ['a', 'b']
'a.b.c'.explode('.', 2); // ['a', 'b.c']

10
我很赞赏你是目前(据我所知)唯一提供了一个与PHP的explode功能相当的实际等效的人(根据原始问题)。 - faazshift
2
多么简单而优雅的解决方案,我希望这是被采纳的答案。 - soger

49

您不需要拆分。您可以使用indexOfsubstr

str = str.substr(str.indexOf(':')+1);

但是和explode等价的方法是split


7
有人可能认为你在说话时有些讽刺。有时候你需要解释清楚每一个细节,例如,“你的问题最好用 'indexOf' 解决...但是 'split' 会直接回答你的问题。” - Joel Mellon
1
投票踩人者: "你竟然提供了一个更简单、更高效的解决方案,而不是验证我的先入为主??" - jchook

32

10

试试这个:

arr = str.split (":");

7

创建对象:

// create a data object to store the information below.
    var data   = new Object();
// this could be a suffix of a url string. 
    var string = "?id=5&first=John&last=Doe";
// this will now loop through the string and pull out key value pairs seperated 
// by the & character as a combined string, in addition it passes up the ? mark
    var pairs = string.substring(string.indexOf('?')+1).split('&');
    for(var key in pairs)
    {
        var value = pairs[key].split("=");
        data[value[0]] = value[1];
    }

// creates this object 
    var data = {"id":"5", "first":"John", "last":"Doe"};

// you can then access the data like this
    data.id    = "5";
    data.first = "John";
    data.last  = "Doe";

7
好的,我会尽力以最简洁明了的方式翻译以下内容:“Seems a little overkill, ty for the response tho”。 - Doug Molineux

6

使用String.split方法

"0000000020C90037:TEMP:data".split(':')


5
如果你喜欢PHP,可以看看 php.JS - JavaScript explode。或者使用普通的JavaScript功能:`
var vInputString = "0000000020C90037:TEMP:data";
var vArray = vInputString.split(":");
var vRes = vArray[1] + ":" + vArray[2]; `

我本想看看她,但只在眼前看到了混乱的JavaScript。嗯,“emptyArray = { 0: '' }”? :-/ - Marcel Korpel
我并没有说这是最好的解决方案,但如果你是JavaScript的新手并熟悉php,那么这是一个不错的解决方案。但我写另一个例子是有原因的。:)“保持简单愚蠢!”;) - eriksv88
听起来很合理,但我认为人们不应该想要将一种编程语言转换成另一种;这可能会误导新手,他们可能会认为JavaScript中的OOP与C++中的OOP类似。此外,有人可能只是复制粘贴了链接的函数,并认为必须以那种方式定义数组。 - Marcel Korpel
是的,我完全同意!但这并不是真正让他掌握代码的关键。如果他懂php,那么可能会错过一些小细节。我所指的是最佳逻辑,而不是复制粘贴的解决方案,因为没有一个好的解决方案!我的经验是,当你意识到自己有很多东西要学习的那一天,你就走上了正确的道路。 - eriksv88
就我所知,这是唯一与PHP功能相同的解决方案。如果未找到分隔符,则结果为原始字符串explode('foo','bar'); // 'bar'。这就是我来到这里的原因,对于我的目的来说,一个复制粘贴脚本是绝对完美的,我打算在其中使用限制。我不必陷入创建自己的轮子中。毕竟,为什么要重新发明轮子呢?K.I.S.S. - Andy Gee

4

console.log(('0000000020C90037:TEMP:data').split(":").slice(1).join(':'))

输出结果: TEMP:data

  • .split()方法可以将一个字符串分解成多个部分
  • .join()方法可以将数组重新组合成一个字符串
  • 如果你想要去掉数组的第一个元素,可以使用.slice(1)方法

这个答案应该有554个赞,而不是被采纳的那个答案。此外,在过去的三年里,被采纳的答案一直是完全错误的,当OP要求1和2时连接了索引0和1。 - NobleUplift

2

并非要批评John Hartsock,只是以防止使用给定代码的任何人界定符数量不同,我正式建议使用以下代码替代...

var mystr = '0000000020C90037:TEMP:data';
var myarr = mystr.split(":");
var arrlen = myarr.length;
var myvar = myarr[arrlen-2] + ":" + myarr[arrlen-1];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接