是否有与php的strtok函数等效的JavaScript?

时间:2018-11-05 23:32:38

标签: javascript php

我正在用javascript寻找与php的strtok函数等效的函数,但发现了以下问题/答案:

javascript or jquery equivalent of PHP's strtok()?

有很多不错的拆分选项,但实际上没有一个等同于strtok。

我在这里添加了输入内容

https://stackoverflow.com/a/53163790/1934903

来自帖子:

我不知道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的strtok还是您必须从头开始编写此功能?

更新

我想我让人们挂在一个假想的解决方案上。我不担心如何一次拆分字符串并处理结果,我在问一个等效项,以便了解是否有与php中的strtok解析工具等效的现成JavaScript。

是的,对于我发布的示例来说,strtok工具并不是最佳选择,该示例是一个简单的拆分并一次使用多个定界符进行替换。

但是,strtok的状态跟踪功能在需要根据解析的第一部分的结果更改解析方式时非常有用。

在我的示例中,我给了两个不同的定界符,一个打开和一个关闭定界符,但是如果您试图进行更复杂的解析,而您正在寻找的定界符根据已解析的字符串的前面部分而改变,该怎么办呢?就像您要根据之前找到的标点查找特定的标点符号一样(例如,我刚刚找到了一个分号,因此现在我想查看下一个标点符号是句点还是逗号,如果它是逗号,则要查找直到我碰到句号为止)。

尝试使用split或regex执行此操作可能会使代码变得非常有条件,或者非常晦涩。您可以编写一个类来跟踪选择和字符串状态,或者可以使用已经跟踪字符串状态并且只担心分支逻辑的函数。

再次,是一个假设,但我想指出的是,我并不是在问如何分割字符串或如何替换字符,更多的是关于是否存在允许这种内置功能的现有功能。状态跟踪,或者是否需要从头开始构建它。

这不存在是很好的,并且每当我要使用它时我都必须自己构建它,我只是想知道其他人是否已经这样做了。

2 个答案:

答案 0 :(得分:1)

简短的答案是:不。没有本地等效项。由于strtok具有某种隐藏的“状态”,因此它在Javascript中也是非常冒险的功能。因此,在Javascript和PHP中,您都必须绝对确保只有一小段代码在使用该函数。

但这有点接近(可以说更好):

const input = '...'; // your string

const index1 = input.indexOf('%');
const match1 = input.substring(0, index1);

// start looking where match1 ended.
const index2 = input.indexOf('^', index1); 

所有这些都比较麻烦,因为您需要注意index。但是,这些都是很好的构建块,它们有可能使您创建更简单的类似strtok的函数。

尽管对于您的特定用例,这要优越得多:

input.replace(/(%([^\^]+)\^)/g, '<b>$2</b>');

通常,当我阅读像您这样的问题时,它强烈表明您还没有花时间学习正则表达式。你真的应该它们是一种超级强大的工具,比您想象的要容易,而且确实是每个程序员都需要的工具。

答案 1 :(得分:1)

您可以编写一个简单的类来复制功能。

const Tokenizer = function (string) {
  this.string = string;
  
  this.tokenize = function (separator) {
    const index = this.string.indexOf(separator);
    
    if (index === -1) return false;
    
    const token = this.string.substring(0, index);
    
    this.string = this.string.substring(index + 1);
    
    return token;
  }
}


const string = 'Lorem ipsum dolor sit amet, modo probatus ut vix, vel ea alia vocent deleniti. Nam in vitae fastidii periculis. Ei est ludus elaboraret. In vim aliquid epicuri, munere pertinacia pro id, ex eos admodum adversarium.';
const t = new Tokenizer(string);


console.log(t.tokenize('.'));
console.log(t.tokenize('.'));
console.log(t.tokenize('.'));
console.log(t.tokenize('.'));
console.log(t.tokenize('.'));