2012-01-27 103 views
2

我有一個變量,像這樣的值:PHP的preg_match找到相關詞語

$sentence = "When it comes time to renew your auto insurance policy, be aware of how your carrier handles renewals"; 

而且我有以下值數組變量:

$searches = array('aware', 'aware of', 'be aware', 'be aware of'); 

$replaces = array('conscious', 'conscious of', 'remember', 'concentrate on'); 

我想找個只是「知道的',然後替換爲'專注於'。輸出象下面這樣:

當談到時間更新您的汽車保險政策,專注於運營商如何處理更新

只有

搜索「知道」作爲相關同義詞替換而不是別人。謝謝你的幫助。

好吧,這裏的新代碼:

$searches = array('aware of', 'be aware of', 'be aware', 'aware'); 

$replaces = array('conscious of', 'concentrate on', 'remember', 'conscious'); 

這是一個動態數組($searches),希望大家理解......我們知道,以獲得最佳代名詞更換使用「」注意'取代'專心'。輸出象下面這樣:

當談到時間更新您的汽車保險政策,專注於運營商如何處理更新

+0

排序字符串長度的搜索模式。並且可能在它們周圍使用'\ b'錨。 – mario 2012-01-27 09:27:11

+0

請在PHP中顯示代碼? – 2012-01-27 09:41:04

回答

0

如何:

$sentence = "When it comes time to renew your auto insurance policy, be aware of how your carrier handles renewals"; 
$searches = array('aware', 'aware of', 'be aware', 'be aware of'); 
$replaces = array('conscious', 'conscious of', 'remember', 'concentrate on'); 

function cmp($a, $b) { 
    if (strpos($a, $b) !== false) return -1; 
    if (strpos($b, $a) !== false) return 1; 
    return 0; 
} 

uasort($searches, 'cmp'); 
$replaces_new = array(); 
$i=0; 
foreach($searches as $k=>$v) { 
    $replaces_new[$i] = $replaces[$k]; 
    $i++; 
} 

$res = str_replace($searches, $replaces_new, $sentence); 
echo $res; 

輸出:

When it comes time to renew your auto insurance policy, concentrate on how your carrier handles renewals 
+0

感謝M42。完美的解決方案! :) – 2012-01-28 00:21:05

+0

@XioJin:不客氣。 – Toto 2012-01-28 10:50:27

1

我假設你的搜索&頂替陣列是靜態的。

試試這個,

str_replace($searches[3],$replaces[3],$sentence)

而且只需更換特定的 「提防」 你可以簡單地做:

str_replace("%be aware of%","concentrate on",$sentence)

+0

請注意,我只需要從具有相同單詞的$搜索中替換相關同義詞。從最大匹配的地方來看,這並不成問題。 – 2012-01-27 09:34:00

+0

不,這不是靜態數組..這是一個隨機排列... – 2012-01-27 09:35:55

+0

雅,所以在這種情況下,簡單地使用'str_replace函數($搜索,$取代,$主題);' – Rikesh 2012-01-27 09:36:05

1

無需這裏正則表達式,

首先以某種方式對您的常量數組進行排序,找到最大的匹配:

$searches = array('be aware of', 'aware of', 'be aware', 'aware'); 
$replaces = array('concentrate on', 'conscious of', 'remember', 'conscious'); 

然後使用str_replace函數

$newsentence=str_replace($searches,$replaces, $sentence); 
+0

請注意,我只需要從具有相同單詞的$搜索中替換相關的同義詞。從最大匹配的地方來看,這並不成問題。 – 2012-01-27 09:33:38

+0

@XioJin這就是爲什麼我重新排列'$ replaces'以同樣的方式,我重新排序'$ searches' – 2012-01-27 09:36:13

+0

$搜索的動態數組,你不能下令值。只要搜索匹配同義詞替換,我們知道真正的同義詞是「知道」 – 2012-01-27 09:37:49

1

如果您改變了搜索的順序,使第一個元素不能元素後數組中的匹配,你可以使用str_replace($searches, $replaces, $subject);正常!

$searches = array('be aware of', 'be aware', 'aware of', 'aware'); 
$replaces = array('concentrate on', 'remember', 'conscious of', 'conscious'); 

如果字符串包含「be aware」,「be aware of」將不匹配並且「be aware」將會。如果你有相反的順序,「知道」會匹配「be aware」,這將是錯誤的。

+0

請注意,我只需要更換從$搜索相關的同義詞有相同的詞。從最大匹配的地方來看,這並不成問題。 – 2012-01-27 09:33:19

+0

@XioJin你從哪裏獲得搜索並從中取代?如果它來自SQL,則可以使用SQL進行排序,這會更容易... – 2012-01-27 10:48:01