Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串中的PHP标记_Php_Tokenize - Fatal编程技术网

字符串中的PHP标记

字符串中的PHP标记,php,tokenize,Php,Tokenize,假设您有一个如下所示的字符串: token1 token2 tok3 您需要获取所有标记(特别是空格之间的字符串),以及它们的位置(偏移量)和长度 所以我想要一个类似这样的结果: array( array( 'value'=>'token1' 'offset'=>0 'length'=>6 ), array( 'value'=>'token2' 'offset'=>

假设您有一个如下所示的字符串:
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
    ),
)
function update($match) {
    return array( 'value' => $value[0], 'offset' => $value[1], 'length' => strlen($value[0]));
}   
array_map('update', $matches[0]);
var_dump($matches[0]);
我知道这可以通过简单地循环字符串的字符来实现,我可以简单地编写一个函数来实现

我想知道,PHP是否有任何内置功能可以有效地实现这一点,或者至少有助于部分实现这一点

我正在寻找建议,并感谢任何提供的帮助。谢谢

您可以使用PREG\u OFFSET\u CAPTURE标志:

然后您只需替换
$matches[0]
中的项目,如下所示:

array(
    array(
        'value'=>'token1'
        'offset'=>0
        'length'=>6
    ),
    array(
        'value'=>'token2'
        'offset'=>7
        'length'=>6
    ),
    array(
        'value'=>'tok3'
        'offset'=>14
        'length'=>4
    ),
)
function update($match) {
    return array( 'value' => $value[0], 'offset' => $value[1], 'length' => strlen($value[0]));
}   
array_map('update', $matches[0]);
var_dump($matches[0]);

您可以使用
explode()
,这将从字符串中获得一个令牌数组,并使用
strlen()
计算字符串中的字符数。据我所知,我认为没有PHP函数可以告诉您元素在数组中的位置

为了解决上一个问题,您可以使用一个计数器变量,该变量在
explod()
ed数组(
foreach()
for
for()
)中循环,并在新数据中为每个子数组指定其位置

如果我错了,请有人纠正我的错误


詹姆斯

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

假设您在$data中存储了
tokena tokenb tokenc

$tokens = explode(' ', $data);
现在您有了一个由空格分隔的令牌数组。它们将按顺序排列,因此$tokens[0]=tokena,$tokens[1]=tokenb等。通过执行
strlen($tokens[$index]),您可以非常轻松地获得任何给定项目的长度
如果您需要知道传递了多少令牌,请使用
$token\u count=count($tokens)


没有那么复杂,但几乎没有什么工作可以得到它。

我最喜欢第一个答案——使用PREG\u OFFSET\u 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;
}

->array_search-在数组中搜索给定的值,如果successful@Rocket-谢谢!事实上,我在不久前遇到过这个函数,但在我写这篇文章时找不到它,所以我把它漏掉了。谢谢你的回答。它仍然没有给出字符串中的位置。假设每个令牌之间有多个空格。第一个解决方案(使用PREG_OFFSET_CAPTURE)更符合我的要求,但谢谢你。哦,你想要每个令牌的字符偏移量,而不仅仅是每个令牌上的索引。我误解了。是的,@Gumbo可能更近了。