2015-08-13 28 views
-6

我有一個這樣的句子,和一些鍵的數組。從鍵數組中搜索字符串。 PHP

$string = "I have a sentence like this, and array of some keys" 
$keys = ['have', 'like', 'some'] 

我需要一個合成陣列這將檢查該串中的單詞,並收集隨後是特定鍵,如在上面的句子

have => a sentence 
like => this, and array of 
some => keys 

$result = ['have'=> 'a sentence', 'like' => 'this, and array of', 'some' => 'keys']; 
字符串

我可以提供的唯一提示是我一直在用遞歸進行嘗試,並且已經成功地達到了80%,其餘的都是相當的錯誤;

我這個嘗試是代碼 其中$preps是關鍵,$query是stirng值

public function sep($preps, $query) { 
    foreach ($preps as $prep) { 
     @list($rval, $lval) = explode(" $prep ", $query); 
     if($lval) { 
      $this->sep[$prep] = $lval; 
      $this->sep($preps, $lval); 
      $this->sep($preps, $rval); 
     } 
    } 
} 
+1

然後去找它。 (你有問題嗎?) – Rizier123

+1

最新問題? – bemontibeller

+0

你必須指定應該發生什麼,如果一個關鍵字在字符串中多於一次?或不存在?!這個發生器背後的邏輯是什麼? –

回答

3

請把更新2解決方案,而第一,二結果

下面的代碼只能如果所有關鍵字都存在於字符串內部。如果不。錯誤將會發生。

$str = "I have a sentence like this, and array of some keys."; 
$keys = ['have', 'like', 'some']; 
$parts = preg_split('/('.implode('|', $keys).')/i', $str); 
$parts = array_slice($parts,1); 
$result = array_combine($keys, $parts); 
print_r($result); 

UPDATE沒有一個很好的解決方案,但它的工作原理:

$str = $modStr = "I have a sentence like this, and array of some keys."; 
$keys = ['have', 'like', 'some']; 
foreach($keys as $key) 
    $modStr = str_replace($key, '[['.$key.']]', $modStr); 
echo $modStr."<br>"; 
preg_match_all('/\[\[([^\]]*)\]\]([^\[]*)/i', $modStr, $parts); 
print_r($parts); 

更新2更好的解決方案:

我認爲這是一個更好的解決方案。這是正則表達式的混合物和字符串的搭配方法:

$str = $modStr = "I have a sentence like this, and array of some keys."; 
$keys = ['like', 'have', 'some']; 
$positions = []; 
// look for each key and be sure it is the whole word (finds only some, not somehow) and save the position in an array. 
foreach($keys as $key) 
    if(preg_match('/\b'.$key.'\b/i', $str, $m, PREG_OFFSET_CAPTURE)) 
     $positions[] = [$key, $m[0][1]]; 
// sort this position array: 
usort($positions, function($a, $b) { return $a[1]-$b[1]; }); 
// now it's easy to split the string, because we have all positions. 
$result = []; 
for($i=0,$n=count($positions);$i<$n;$i++) { 
    $kvPair = $positions[$i]; 
    $pos = $kvPair[1]+strlen($kvPair[0]); 
    $result[$kvPair[0]] = substr($str, $pos,($i+1<$n?$positions[$i+1][1]:strlen($str))-$pos); 
} 
print_r($result); 

此代碼的工作也如果字符串,如果一個關鍵字丟失的鑰匙後跟特殊字符。

+1

感謝哥們,它幾乎可以工作,但是如果我把$ key數組作爲['like','have','some']會怎樣。它提供了錯誤的輸出。你能給我一個解決方案嗎?再次感謝:) –

+0

@MdAdil增加了另一種解決方案。但我並不滿意 –

+0

@MdAdil啊。給我一分鐘。我有個主意。 –