是否可以组合strtok()和substr()?

时间:2017-04-11 20:02:19

标签: php

我最近开始使用PHP并尝试从.txt创建列表但是删除了所有不必要的组件。 一条线得到了这个

item = 0    egg    came_from_chicken

我想删除item =came_from_chicken0 egg留给我substr()。 现在经过一些搜索,我发现strtok()删除了每行的前5个字符。之后我还发现<?php $lines = file('../doc/itemlist.txt'); $newf = array(); foreach ($lines as $line) { $newf[] = strtok($line, "\t") . "\t" . strtok("\t"); } var_dump($newf); ?> 可以在第二个标签后删除其他不需要的文字。不幸的是我无法将这些结合起来所以我的问题是:如何从每一行中删除前5个字符并从每行删除第二个标签后的所有内容?

到目前为止我已经知道了这一点:

egg

此功能类似于删除item =之后的所有内容,但仍需删除Task

5 个答案:

答案 0 :(得分:0)

此方法适用于=符号前面的任何字符串。

foreach ($lines as $line) {
  $newf[] = implode("\t", array_slice(explode("\t", trim(explode('=', $line, 2)[1])), 0, 2));
}

答案 1 :(得分:0)

快速而肮脏的方法就是将它全部包装起来:

$newf[] = substr(strtok($line, "\t") . "\t" . strtok("\t"), 5);

但是,我个人不喜欢strtok()(无法解释原因,我只是不喜欢它)。如果您不需要从第二个标签中删除所有内容,但是从最后标签中删除(在您的示例中,第二个标签是最后一个标签页),将使用strrpos()查找最后一个标签的位置,并将其转储到substr()

$newf[] = substr($line, 5, strrpos($line, "\t")-5);

-5是为了补偿你从头开始剥离的5个字符。如果您需要从字符6而不是5开始,您还应该从strrpos()返回中减去6。

编辑别介意整个最后一部分,我刚看到您发布的示例格式,而您确实需要第二个标签而不是最后一个标签。

答案 2 :(得分:0)

您可以使用正则表达式:

<?php
$lines = file('./file.txt');
$newf = array();
foreach ($lines as $line) {
    $newf[] = preg_replace('/.*=\s*(.*)\t.*/s', '$1', $line);
}

var_dump($newf);

输出:

array(1) {
  [0]=>
  string(5) "0  egg"
}

答案 3 :(得分:0)

假设您将收到与您提供的示例类似的模式。

你可以做一个简单的行:

$str = "item = 0    egg    came_from_chicken"; 
$parts = preg_split('/\s+/', $str);
echo $parts[2] . $parts[3];

答案 4 :(得分:0)

我知道这不是您正在寻找使用strtok的答案,但我相信下面的代码会更容易:

<?php
    $lines  = '../doc/itemlist.txt';

    // array to store all data
    $newf   = array();

    foreach ($lines as $line) {
        // you can do an explode which will turn it into an array and you can then get any values you want
        // $newf [] = strtok ($line, "\t") . "\t" . strtok("\t"); // throw away

        // lets say we use [item = 0    egg    came_from_chicken] as our string
        // we split it into an array for every tab or spaces found
        $values     = preg_split ('/\s+/', $line);
        //returns
        //  Array
        //  (
        //      [0] => item
        //      [1] => =
        //      [2] => 0
        //      [3] => egg
        //      [4] => came_from_chicken
        //      [5] => 
        //  )

        // lastly store your values which would be sub 2 and sub 4
        $newf []    = $values [2] . ' ' . $values [3];
    }

    var_dump($newf);

    // return
    // array (size=3)
    // 0 => string '0 aaa' (length=5)
    // 1 => string '1 bbb' (length=5)
    // 2 => string '2 ccc' (length=5)
?>