2012-12-12 31 views
0

我已經寫了這個腳本,以便能夠在我的代碼中使用bb-code標籤。花了很多時間決定最佳方法並在How to dynamically replace bb tags?詢問後,我決定使用preg_replace_callback。多個項目和preg_replace_callback

有一個問題卻與在同一行

Man [forvo=man,nl] 
Mannen [forvo=mannen,nl] 

的部分上述工程的多個項目,但下面不會。

Kip [forvo=kip,nl] - Kippen [forvo=kippen,nl] 
Bal [forvo=bal,nl] - Ballen [forvo=ballen,nl] 
Vrouw [forvo=vrouw,nl] - Vrouwen [forvo=vrouwen,nl] 

我知道使用的file_get_contents()是不是一個推薦的選擇,但我也要找到了preg_replace_callback另一種解決辦法,如果我想每行使用多個Forvo中標籤?

<?php 
// Replace forvos in the lesson 
$lesson_body = $lesson['Lesson']['body']; 

function forvize($match) { 
    $word = $match[1]; 
    $language = $match[2]; 
    $link = "http://apifree.forvo.com/action/word-pronunciations/format/js-tag/word/".$word."/language/".$language."/order/rate-desc/limit/1/key/API_KEY/"; 
    $link = file_get_contents($link); 
    return $link; 
} 

//URL's 
$lesson_body = preg_replace_callback("/\[forvo\=(.*),(.*)\]/", 'forvize', $lesson_body); 

?> 

回答

0

你做的錯誤很常見。默認情況下,完全停止(.,也被稱爲)匹配任何字符,但換行符。所以,如果你有一條線的單一設置高亮,這是沒有問題的:

/\[forvo\=(.*),(.*)\]/ 

但是,如果你有更多的線路上的單一的bbcode,點會採取儘可能匹配的模式:

[forvo=aaaa,bbbbb] ... [forvo=cccc,dddd] 
     (.*      ),(.*) 

你可以做的反而是限制的第一個參數中的所有字符,但逗號(,),第二個參數的所有字符,但右方括號(])。

實施例:

/\[forvo\=([^,]*),([^\]]*)\]/ 
0

捕捉那些使用ungreedy量詞(又名問號。)至amke它捕獲所有直至該圖案中的以下字符的第一次出現的一種方式。

~\[forvo=(.*?),(.*?)\]~

  • 第一個括號組匹配一切從等號,直到第一個逗號
  • 第二個逗號後匹配eveything直至收盤括號

另一種選擇是使其趕上除了特定的字符(在這種情況下分別爲逗號和右括號)。查看@hakre的答案,看看它是如何完成的。