2015-05-03 26 views
0

我試圖使這個工作。我想在給定的位置之間替換句子的某些部分,然後用變化顯示整個句子。使用下面的代碼,我可以進行更改,但我不知道如何將其餘部分放在一起。提取併合並不同位置之間的字符串

我有兩個陣列,一個是女性名字出現的位置,另一個是男性名字。當一個女人在一個男人之前,代碼用「她」代替代詞「他的」。我需要的最後一件事是重建與所做的更改的句子,但我不知道如何提取句子的其餘部分(結果,例如,從位置0到20(瑪麗亞她的衣服,但是)和36到51(Lorena她的狗),但我需要從20到36(彼得的牛仔褲)和51到最後(胡安他的車)提取合併他們的位置)。

結果應該是:「瑪麗亞她的衣服,但彼得他的牛仔褲羅蕾娜她的狗胡安他的車」。我會很感激任何幫助,我一直在尋找其他類似的問題,但我什麼也沒找到。

<?php 

$womenpos = array("0","36"); //these arrays are just examples of positions 
$menpos = array("20","51"); //they will change depending on the sentence 
$sentence = "Maria his dress but Peter his jeans Lorena his dog Juan his car"; 

echo $sentence."\n";  


foreach ($womenpos as $index => $value) { 
    $value2 = $menpos[$index];  

    if($value < $value2) { 
     echo "\nWoman(" . $value . ") is before man(" . $value2 . ")\n"; 
     $end = ($value2 - $value); 
     $improved = str_replace(' his ', ' her ', 
         substr($sentence, $value, $end));       

     echo $improved."\n";     

    } else { 
     $improved = "Nothing changed"; 
    echo $improved; 
    }  

} 
+0

目前還不清楚你問什麼。 – felipsmartins

+0

我已經用(希望)更好的解釋更新了這個問題。 –

+0

重要的問題:你是否試圖用'她'代替'她'這個詞(如果是這樣,一個沒有任何位置信息的正則表達式替換工作就沒問題,這是一個oneliner),還是你試圖用一個句子替換數據位置+長度,在這種情況下,您只需執行子字符串分割,然後將其加入替換項中 –

回答

1

好了,這個怎麼樣:

$womenpos = array("0","36"); 
$menpos = array("20","51"); 
$bothpos = array_merge($womenpos,$menpos); 
sort ($bothpos); 
print_r($bothpos); 

$sentence = "Maria his dress but Peter his jeans Lorena his dog Juan his car"; 

echo $sentence."\n";  

for ($i = 0; $i<sizeof($bothpos); $i++) { 
    $start = $bothpos[$i]; 
    if ($i ==sizeof($bothpos)-1) { 
     $end = strlen($sentence); 
    } 
    else { 
     $end = $bothpos[$i+1]; 
    } 
    $length = $end-$start; 
    $segment = substr($sentence, $start, $length); 
    if (in_array($start, $womenpos)) { 
     $new_segment = str_replace (' his ', ' her ', $segment); 
    } 
    else { $new_segment = $segment; } 
    $improved .= $new_segment; 
    print "<li>$start-$end: $segment : $new_segment </li>\n"; 
} 

print "<p>Improved: $improved</p>"; 

這結合了男性和女性的地位陣列考慮文本的每個伸展爲一個可能有錯誤。如果這段文字從其中一個女士點開始,那麼它會將'他'改爲'她'。如果不是,它會讓它一個人留下。

這是否讓你朝着你想要的方向走?但願如此!

+0

這就是我正在嘗試做的事情,但我永遠無法想象這樣的解決方案。謝謝肯! –

+0

太好了 - 我很高興工作! –

0

此不同的處理該問題,但我不知道它是否會提供你正在尋找解決方案:

$sentence = "Maria his dress but Peter his jeans Lorena his dog Juan his car"; 

$women = array ("Maria", "Lorena"); 

$words = explode (" ", $sentence); 

for ($i=0; $i< sizeof($words); $i++) { 
    if ($words[$i] == "his" && in_array($words[$i-1], $women)) { 
     $words[$i] = "her"; 
    } 
} 

print (join(" ", $words)); 

此經過的話一次一個;如果前面的單詞在$ women數組中並且當前單詞是「his」,則它將單詞更改爲「her」。然後按順序吐出所有的單詞。

這是做你需要什麼,或者你真的想複雜的字符串定位的答案?

+0

您的選擇的問題是,不會總是前面的詞,句子只是一個例子,代詞可以在任何其他位置的句子,如「瑪麗亞洗他的車和約翰他的自行車」 –

+0

我們當然可以想出一個依賴於字符串定位的解決方案,但是這不需要編寫代碼的人已經知道有問題的字符串的位置了嗎? 您是否希望代碼能夠檢測到問題,或只回答編碼器知道的問題字符串? –

+0

我已經有了存儲有問題字符串的位置的代碼,它提供了兩個數組:一個用於女性的名字,另一個用於男性的名字。我不知道的是一旦我做出改變,如何重寫這個句子。 –

相關問題