2011-10-20 66 views
3

是否有一个相当于PHP的strtok()?在PHP中,我会使用javascript或jquery相当于PHP的strtok()?

$sub = strtok($string, ':'); 

Thanks to Phil's answer for that

不过,我需要做同样的JavaScript。

我有一个包含这样的值的选择列表:

<select id="myFonts"> 
    <option value='Leckerli One'>Leckerli One</option> 
    <option value='Lekton:regular,italic,bold'>Lekton (plus italic and bold)</option> 
    <option value='OFL Sorts Mill Goudy TT:regular,italic'>OFL Sorts Mill Goudy TT (plus italic)</option> 
</select> 

而在jQuery的变化情况下,我需要提取“值”字段。但是,如果值字段包含一个冒号,我需要在冒号前拉动字符串内容,并在它后面返回任何内容。

举例来说,在我上面的例子中,我需要返回的值:

Leckerli一个 Lekton OFL排序穆勒Goudy TT

这里是我的jQuery目前当值包含冒号(不能正常工作和附加属性):

$('#myFonts').change 
(
    function() 
    { 
    var myFont = $('#myFonts :selected').val(); 
    $('#fontPreviewSrc').attr('href','http://fonts.googleapis.com/css?family='+myFont); 
    $('.fontPreview').attr('style','font-family:'+myFont+';font-style:normal;font-size:2em;padding-top:10px;white-space:nowrap'); 
    } 
); 
+3

你有没有试过'split()' – Amit

回答

6

用途:

$('#myFonts :selected').val().split(':')[0] 
2

您正在寻找的split方法。通过限制长度为1,你可以在冒号之前提取值

支持多个字符以同样的方式PHP strtok()确实
var beforeColon = value.split(':', 1)[0] 
4

这里有一个本地JavaScript解决方案:

/** 
* @param {string} s  the string to search in 
* @param {string} chars the chars to search for 
* @param {boolean=} rtl option to parse from right to left 
* @return {string} 
* @example tok('example.com?q=value#frag', '?#'); // 'example.com' 
* @example tok('example.com?q=value#frag', '?#', true); // 'frag' 
*/ 
function tok (s, chars, rtl) { 
    var n, i = chars.length; 
    rtl = true === rtl; 
    while (i--) { 
     n = s.indexOf(chars[i]); 
     s = n < 0 ? s : rtl 
      ? s.substr(++n) 
      : s.substr(0, n); 
    } 
    return s; 
} 

使用indexOfsubstrslice比弹出或移动时使用split要快。请参阅jsperf.com/tok

+1

超好的工作。特别是rtl。 –

+0

@ user1869322谢谢=] – ryanve

+1

...复制并记入。 –

1

如上所述,对单个字符分隔符使用分隔符。 对于多个字符分隔符我写了这个:

function strtok(src, delim){ 
    delim_escaped = new RegExp('[' + delim.replace(/[\[\]\(\)\*\+\?\.\\\^\$\|\#\-\{\}\/]/g, "\\$&") + ']', 'g'); 
    return src.replace(delim_escaped, delim[0]).split(delim[0]); 
} 
0

与此相关的,你可能有兴趣在these benchmarks。请注意,slicesubstrsubstring的选项仅在您确定存在分隔符时才有效。如果分隔符可能不存在(如第一个示例中所示),请根据其他用户的建议使用split的版本。