2010-11-15 72 views
2

比方说,你有一个字符串,它看起来像这样: token1 token2 tok3PHP令牌从一个字符串

而且你想获得的所有令牌(特别是空间之间的字符串),以及它们的位置(偏移)和长度)。

所以我希望的结果,看起来是这样的:

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

我知道,这可以通过简单地通过字符串的字符循环来完成,我可以一个SimPy编写一个函数来做到这一点。

我想知道,PHP有什么内置的,将有效地做到这一点,或至少有助于这一部分?

我在寻找建议,并感谢任何帮助。由于

回答

3

您可以使用preg_match_allPREG_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]); 
1

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

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

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

James

+1

http://us3.php。net/array_search - > array_search - 在数组中搜索给定的值,如果成功返回相应的键 – 2010-11-15 19:33:27

+0

@火箭 - 谢谢!前段时间我实际上遇到过这个功能,但是当我写这篇文章的时候找不到它,所以我就把它排除了。 – Bojangles 2010-11-15 19:38:20

4

在大多数方面都有一个更简单的方法。您将有一个更基本的结果,但与工作放少得多的。

假设你有tokena tokenb tokenc存储在$数据

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

现在,你必须用空格分隔的标记的数组。它们将按顺序排列,所以$ token = [token],$ tokens [1] = tokenb等。您可以非常容易地通过执行strlen($tokens[$index]);来获取任何给定项目的长度。如果您需要知道已通过多少令牌,使用$token_count = count($tokens);

并不复杂,但接近没有工作得到它。

+0

感谢您的回答。它仍然没有给出字符串中的位置。假设每个令牌之间有多个空格。第一个解决方案(使用PREG_OFFSET_CAPTURE)更多的是我正在寻找的,但谢谢。 – chaimp 2010-11-15 19:37:55

+0

哦,你想要每个标记的字符偏移量,而不是每个标记的索引。我误解了。是的,@Gumbo可能更接近。 – 2010-11-15 19:42:26

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; 
}