javascript或jquery相当于PHP的strtok()?

时间:2011-10-20 20:16:11

标签: jquery regex

是否存在与PHPs strtok()相当的javascript?在PHP中,我使用

$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更改事件中,我需要提取“value”字段。但是,如果value字段包含冒号,我需要在冒号之前拉出字符串内容,然后不返回任何内容。

例如,在上面的示例中,我需要返回的值:

Leckerli One Lekton OFL Sorts Mill 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');
    }
);

7 个答案:

答案 0 :(得分:8)

使用:

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

答案 1 :(得分:4)

这是一个本地JavaScript解决方案,支持多个字符,与PHP strtok()的方式相同:

/**
 * @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使用pop或shift更快。见jsperf.com/tok

答案 2 :(得分:3)

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

var beforeColon = value.split(':', 1)[0]

答案 3 :(得分:1)

如果有冒号,这将获取冒号前的所有内容,如果没有冒号,则会获得整个值:

var myFont = $('#myFonts :selected').val().split(':')[0];

http://jsfiddle.net/mblase75/8uWCN/

答案 4 :(得分:1)

如上所述,使用split for single char delimiter。 对于多个字符分隔符,我写了这个:

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我不知道javascript中php的strtok函数的确切含义(我正在搜索相同的函数),但是我注意到这里的所有答案都错过了strtok函数的细微差别,并想指出出来。

如果您要做的只是基于单个标记分解字符串,那么各种分割和切片方法都可以,但是strtok不仅能做到这一点。它走一串,并记住它停在哪里。就像在后台使用指针一样。

考虑以下字符串:

  

ullamcorper dignissim非非Turpis。 Donec坐在amet pharetra上。 Suspendisse tristique luctus%velit,ac maximus tortor ullamcorper等。 Vivamus vitae magna a lectus mollis tempus ac commodo orci ^。 Donec aliquam malesuada massa sed interdum。 Curabitur amet exdictum,sollicitudin eros non,rutrum enim。

如果您想用粗体标签将%^之间的文本换行,您该怎么做?您可以拆分,获取索引等,但是strtok函数可以让您以更复杂的方式遍历字符串:

// assume the `$string` variable holds the big string above
$pre = strtok($string, '%');

$boldme = strtok('^');
$bolded = "<b>$boldme</b>";

$post = strtok("\n");

$newstring = implode("", [$pre, $bolded, $post]);

echo $newstring

现在,您的新字符串如下所示:

  

ullamcorper dignissim非非Turpis。 Donec坐在amet pharetra上。 Suspendisse tristique luctus velit,ac maximus tortor ullamcorper等。 Vivamus vitae magna a lectus mollis tempus ac commodo orci 。 Donec aliquam malesuada massa sed interdum。 Curabitur的履历不限,而sollicitudin eros non,rutrum enim。”

strtok函数将允许您在不同的时间使用不同的令牌来分解字符串,并且由于该函数在初始化后作用于相同的字符串,因此可以在调用之间执行逻辑。

我不知道可以完成所有这些操作的php函数,但是如果有人愿意,我很想知道;)