2010-11-15 68 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; 
}