【问题标题】:get substring between 2 characters in javascript在javascript中获取2个字符之间的子字符串
【发布时间】:2014-03-31 17:54:58
【问题描述】:

首先,我尝试在 SO 上搜索它,但找不到解决方案。我有一个字符串

var str = 'a:5:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";}';

我想在 javascript 中将 " " 之间的所有数字作为数组获取。我在其中一个 SO 问题上尝试了这个建议。

console.log(str.split(/[""]/));

但这会输出

["a:5{i:0;s:1:", "1", ";i:1;:", "2", ";i:2;s:1:", "7", ";i:3;s:1:", "4", ";i:4;s:1:", "5", ";}"]

这并不准确。

实际上,上面的字符串是存储在 MemcacheD 中的 PHP 数组,我在 Node.JS 中检索它,这就是为什么我不能使用 json_encode 左右。我不擅长正则表达式。所以专家们请多多指教。

上面字符串的结果应该是这样的数组或者字符串

str = "1,2,3,4,5"; 

或者像

这样的数组
array = [1,2,3,4,5];

【问题讨论】:

  • 这看起来有点像bencoded 字符串(但不是)?编码是什么?
  • 我不知道。我刚刚在 Node.js 中使用它的扩展 Memcached 得到了这个字符串。这是一个 PHP 存储在 memcached 中的数组。
  • 知道这一点真的很有用,因为 javascript 中可能有可用的解码器。这比 RegEx 好得多。
  • 我希望有。但目前我认为我必须使用正则表达式得到它,比如 1,2,3,4,5 然后将它拆分成一个数组。
  • 这是一个用serialize生成的php数组,而memcached是一个内存缓存,你可以从任何地方连接到它。

标签: javascript php regex arrays serialization


【解决方案1】:
str.match(/"\d+"/g).join().replace(/"/g,'')
// "1,2,3,4,5"

【讨论】:

  • Matt 是否可以将 user 之类的关键字附加到每个结果中,例如输出应该是“1user,2user,3user,4user,5user”?可以的话请看
  • @CodeDevil str.match(/"\d+"/g).join().replace(/"(\d+)"/g,"$1user")
  • 如果字符串中有这样的字母,为什么你的正则表达式不起作用 'a:7:{i:0;s:1:"1";i:1;s:12:"John Smith";i:2;s:19:"我的生活从这里开始";i:3;s:31:"这是我的 .Picture.jpg";i:4;s:10:"1988-07-26 ";}' 即使他们只是喜欢 "" 之间的前一个,例如:"John Smith"?
  • 请@Matt 看看这个问题
  • @CodeDevil 有两个原因:1) 你的问题说'我想获取所有 numbers 之间的 " "' 2) \d 只匹配数字。如果您想概括,这将是一个单独的问题,因为策略会有所不同。 (如果这是一个简单的更改,我很乐意分享。)
【解决方案2】:

所以,这是一个 PHP serialized 字符串。 php.js 项目中有一个可用于 javascript 的 unserialize 版本。

所以使用那个函数。

Javascript

var str = 'a:5:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";}';

console.log(unserialize(str));

输出

["1", "2", "3", "4", "5"] 

开启jsFiddle

如果您使用的是 nodejs,那么您还可以考虑使用像 php-unserialize 这样的模块

【讨论】:

  • 天哪,这很好,但你不认为使用正则表达式会比这么长的代码更好吗?
  • IMO,我会说不。
  • 伟大的 Xotic,感谢您推荐模块
  • 没问题。 nodejs 模块基本上使用了php.js 上提供的功能,只是包装为一个模块。 :)
  • 我尝试了您建议的 jsFiddle,但是在处理带有这样的字母的子字符串时失败了 'a:7:{i:0;s:1:"1";i:1;s:12: "约翰·史密斯";i:2;s:19:"我的生活从这里开始";i:3;s:31:"这是我的 .Picture.jpg";i:4;s:10:"1988-07 -26";}';有什么解决办法吗?
【解决方案3】:
function match_all(str, re) {
    var ret = [], v;
    while(v = re.exec(str)) {
        ret.push(v[1]);
    }
    return ret;
}
var str = 'a:5:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";}';
var numbers = match_all(str, /"(\d+)"/g);
console.log(numbers);
//to convert the result to ints
console.log(numbers.map(function(v) { return +v; }));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2013-02-09
    • 2015-02-18
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多