2014-02-09 78 views
0

我有許多句子,我想用一個單詞替換每個單詞,這個單詞(或其變體)包含在句子中。我把我的正則表達式模式放在一個索引數組中,這些索引數組是單個字在每個字符串中查找的。我有具有替換字(這些詞語只是簡單的例子)的第二陣列:用php中的preg替換字符串中的元素使用php中的preg

$pattern = array('/one/','/two/','/three/'); 
$replacements = array('ones','twos','threes'); 

例如說我有一句:

"There is one tree" 

然後我想與

替換句子
"ones" 

我曾經嘗試都preg_replacepreg_replace_calback,並不一定要使用哪一個或者我是否應該使用preg_match

我想這一點:

$simplified = preg_replace_callback($pattern, function($matches) { 
     return $replacements[array_search($matches[0], $pattern, true)]; 
}, $simplified, 1); 

其中$simplified包含我想替換句子的單詞。

我相信array_search適用於關聯數組,但我試着循環索引數組。我必須找到真正匹配句子中單詞的正則表達式,並且需要獲得匹配的索引以在替換數組中找到正確的單詞。這是漫長的,可能是錯誤的方法。

我的問題是: 1.我接近這個錯誤? 2.如果這種方法可行,我怎樣才能用一個單詞替換句子?

+0

這些取代你的實際替換?你只需要在比賽中加入一個's',如果是這樣的話,就像[this](http://regex101.com/r/tP3sR1)一樣。 – Jerry

+0

我掙扎了一下,準確地解釋了我想要做的事情,實際示例文本是:「3件背心」,在句子中包含單詞背心或背心的兩種情況下,我想用句子替換句子單詞「背心」。 – jmarais

回答

0

preg_replace_callback()不適用於此任務 - 對於正則表達式中的每個匹配項,它都會調用傳遞匹配文本作爲參數的函數。你不希望出現這種情況。改爲使用preg_match()

首先,創建一個模式字符串作爲鍵和替換字符串作爲值的關聯數組。循環遍歷組合數組,檢查模式是否與字符串匹配 - 如果是,則用相應的$replacement替換整個單詞並退出循環。

代碼:

$string = "There is one tree"; 

$patterns = array('one','two','three'); 
$replacements = array('ones','twos','threes'); 
$combined = array_combine($patterns, $replacements); 

foreach ($combined as $pattern => $replacement) { 
    $pattern = sprintf('/\b%s\b/', preg_quote($pattern, '/')); 
    if (preg_match($pattern, $string)) { 
     $string = $replacement; 
     break; 
    } 
} 

echo $string; // => ones 

注:

  • sprintf()只是用來創建模式串
  • preg_quote()正確逃生正則表達式字符。如果您需要在某些文本中匹配運行時字符串,並且該字符串可能包含特殊的正則表達式字符,這非常有用。
  • \b是一個元字符,匹配任何字邊界。換句話說,\b匹配單詞開頭或結尾的空字符串。該匹配爲零長度,這意味着它不消耗任何字符

有關preg_replace_callback()的更多信息,我建議您閱讀this answer。它非常簡短地描述了preg_replace_callback的工作。 documentation for preg_replace_callback()也很棒。