来自字符串的PHP标记

问题描述 投票:3回答:4

假设您有一个如下所示的字符串:token1 token2 tok3

并且您希望获得所有标记(特别是空格之间的字符串),以及它们的位置(偏移量)和长度)。

所以我想要一个看起来像这样的结果:

array(
    array(
        'value'=>'token1'
        'offset'=>0
        'length'=>6
    ),
    array(
        'value'=>'token2'
        'offset'=>7
        'length'=>6
    ),
    array(
        'value'=>'tok3'
        'offset'=>14
        'length'=>4
    ),
)

我知道这可以通过简单地循环字符串的字符来完成,我可以简单地编写一个函数来执行此操作。

我想知道,PHP是否有任何内置功能可以有效地执行此操作,或者至少可以帮助解决部分问题?

我正在寻找建议并感谢任何帮助。谢谢

php tokenize
4个回答
4
投票

您可以将preg_match_all与PREG_OFFSET_CAPTURE标志一起使用:

$str = 'token1 token2 tok3';
preg_match_all('/\S+/', $str, $matches, PREG_OFFSET_CAPTURE);
var_dump($matches);

然后你只需要像这样替换$matches[0]中的项目:

function update($match) {
    return array( 'value' => $value[0], 'offset' => $value[1], 'length' => strlen($value[0]));
}   
array_map('update', $matches[0]);
var_dump($matches[0]);

4
投票

在大多数方面,有一种更简单的方法。您将获得更基本的结果,但投入的工作量要少得多。

假设你有tokena tokenb tokenc存储在$ data中

$tokens = explode(' ', $data);

现在,您有一个由空格分隔的标记数组。它们将按顺序排列,所以$令牌[0] = tokena,$ tokens [1] = tokenb等。你可以通过strlen($tokens[$index]);轻松获得任何给定项目的长度如果你需要知道你通过了多少令牌,使用$token_count = count($tokens);

不那么复杂,但接下来没有工作要做到。


1
投票

您可以使用explode(),它将为您提供字符串中的标记数组,以及strlen()来计算字符串中的字符数。据我所知,我不认为有一个PHP函数可以告诉你元素在数组中的位置。

为了解决最后一个问题,你可以使用一个循环通过explod()ed数组的计数器变量(foreach()for())并在新数据中给出每个子数组的位置。

如果我错了,请有人纠正我。

詹姆士


0
投票

我最喜欢第一个答案 - 使用PREG_OFFSET_CAPTURE。如果其他人感兴趣的话,我最后也写了一些这样做的东西,尽管我会接受第一个答案。

谢谢大家的帮助!

function get_words($string) {
    $string_chars = str_split($string);

    $words = array();
    $curr_offset = 0;

    foreach($reduced_string_chars as $offset=>$char) {
        if ($char == ' ') {
            if ($length) $words[] = array('offset'=>$curr_offset,'length'=>$length,'value'=>implode($value_array));

            $curr_offset = $offset;
            $length = 0;
            $value_array = array();
        }
        else {
            $length++;
            $value_array[] = $char;
        }

    }

    return $words;
}
© www.soinside.com 2019 - 2024. All rights reserved.