2012-08-05 107 views
1

我認爲這是我尋找的一種奇怪的事情。解析包含自定義條件的純文本

我有以下的文本字符串:

$string = "The compass is pointing <north|south|east|west> towards <London|Paris|Rome>"; 

不知怎的,我要分析此獲得以下任一輸出:

  • 指南針北指向巴黎
  • 指南針指向南朝倫敦
  • 指南針指向東向羅馬
  • 指南針東部指向倫敦
  • 等等

對於每一組<>文本字符串,我需要的內容轉換爲數組(使用​​?),那麼該陣列上運行array_rand獲取我們將顯示的選項的關鍵字,然後只讀數組並返回該值。

問題是,我幾乎沒有經驗的文本解析,但我想你會在這種類型的問題中使用preg_replace

如果有人能幫助我開始,我將不勝感激。

回答

1

您可以使用preg_replace_callback()來執行選擇隨機替換的函數。

$string = "The compass is pointing <north|south|east|west> towards <London|Paris|Rome>"; 

$callback = function ($match) { 
    $opts = explode('|', $match[1]); 
    return $opts[array_rand($opts)]; 
}; 

echo preg_replace_callback('/<(.+?)>/', $callback, $string); 

working example

的模式匹配<,任何東西(.+),和>"lazy" quantifier?使+找到最短匹配時停止,而不是「貪婪」並尋找最長可能的匹配(這是默認行爲)。沒有它,它會一直匹配到最後的>,這太過分了。

()創建一個子模式,因此,儘管$match[0]會是什麼被整個模式(包括< >),$match[1]將只包含子模式(無< >)相匹配。

每次找到匹配時都會調用回調函數,並且它完全按照您所描述的 - explode()選項列表並返回一個隨機值。返回值然後替換原始匹配。