2012-12-11 55 views
-2

有麻煩返回位置的數組:的preg_match返回數組PREG_OFFSET_CAPTURE

function returnPosition($string,$start){ 
    preg_match('/' . preg_quote($start, '/').'/im', $string, $m, PREG_OFFSET_CAPTURE); 

    $startArr = array(); 

    foreach ($m as $value) 
    { 
     $startArr = array_push($startArr, $m); 
    } 
    //var_dump($startArr); 
    return $startArr; 
} 

感謝

+0

-1?我只花了大量的時間嘗試不同的方法來返回位置值的數組... – John

回答

2

毫不奇怪,你是using array_push wrong。它確實不是返回修改後的數組。它返回數組中新的元素個數,因此在每次迭代中,您都會拋棄曾經是具有int的數組。嘗試

$startArr[] = $m; 

或至少只是

array_push($startArr, $m); 

沒有分配的。

+0

謝謝@MarcB,我得到'array(1){[0] => array(1){[0] = > array(2){[0] => string(5)「hello」[1] => int(0)}}}'在var_dump中。它看起來像數組嵌套使用輸入'returnPosition(「你好你好你好」,「你好」);'。另外我只需要位置號碼,那麼我怎樣才能得到像這樣的數組(1,13,20)? – John

+1

http://php.net/preg_match_all閱讀關於'preg_offset_capture'的註釋。 preg_match同樣適用。 –

+0

謝謝,檢查出來並嘗試重新使用一些示例(通常適用於我),但它仍然不清楚。看起來很簡單,我一直試圖找出現在幾個小時... – John

0

找到東西爲我的作品:

function getTagPositions($strBody, $start, $end) 
{ 
    preg_match_all('/' . preg_quote($start, '/') . '([\w\s.]*?)'. preg_quote($end, '/').'/im', $strBody, $strTag, PREG_PATTERN_ORDER); 
    $intOffset = 0; 
    $intIndex = 0; 
    $intTagPositions = array(); 

    foreach($strTag[0] as $strFullTag) { 
     $intTagPositions[$intIndex] = array('start' => (strpos($strBody, $strFullTag, $intOffset)), 'end' => (strpos($strBody, $strFullTag, $intOffset) + strlen($strFullTag))); 
     $intOffset += strlen($strFullTag); 
     $intIndex++; 
    } 
    return $intTagPositions; 
} 


$intTagPositions = getTagPositions("hello there hello hello","he","lo"); 
// returns 
Array ([0] => Array ([start] => 0 [end] => 5) [1] => Array ([start] => 7 [end] => 17) [2] => Array ([start] => 18 [end] => 23))