2011-04-29 62 views
2

在我們使用「內部」系統之前,我們正在轉換爲降價,其中圖像鏈接以及其他所有數據(例如alt)在另一個括號中。Preg_replace_all markdown格式的鏈接

例如{IMAGE LINK}[OPTIONAL ALT WITH OTHER DATA]

現在我們正在向降價,(我們的數據被存儲爲降價在數據庫中),我需要一切轉換成降價:

所以,我怎樣才能把所有實例{LINK}[OPTIONAL DATA](方括號不是必需的,所以一些只是{})到降價當量:

基本上,

{http://www.youtube.com/image.gif}[this is optional alt] INTO ![alt](http://www.youtube.com/Image.gif)

到目前爲止我有以下內容,但是是否處理可選的[ALT DATA]標記?

if (preg_match_all('/\[(.*?)\]/i', $string, $matches, PREG_SET_ORDER)) 
    { 


    } 

回答

1

要處理可選的alt屬性,您應該使用preg_replace_callback。這允許您測試alt attr的存在並在必要時添加它。

$str = ' 
This is an image {http://www.youtube.com/image.gif}[this is optional alt] 
This is an image with an alt attribute {http://www.youtube.com/image.gif} 
'; 

echo preg_replace_callback(
    '~{(http://[^s]+)}(?:\[(.*?)\])?~', 
    function($m){ 
     if (isset($m[2])) { 
      return $img = sprintf('![%s](%s)', $m[2], $m[1]); 
     } 
     return $img = sprintf('(%s)', $m[1]); 
    }, 
    $str 
); 
+0

你錯過了![]從第二個回報(它的要求),但除此之外,這是正確的 – jonnnnnnnnnie 2011-04-29 20:43:45

+0

@jonnnie:即時消息不會錯過![],該返回語句是爲圖像與alt attribs – Galen 2011-04-29 20:49:14

0

簡單的情況是

{(.*?)}\[(.*?)\] <-- search pattern 
![\1](\2)   <-- replace pattern 

,但你會包含轉義字符(\{\}\[\])鏈接被搞砸了。這將涉及一個前瞻,你將不得不希望別人爲你寫信。但是,如果這只是圖片網址,則不應該有太多(如果有)的情況發生。

0

爲此我會使用preg_replace_callback。在那裏,更容易探索可選的alt標籤和/或構建替代品。

$source = preg_replace_callback('# 
     \{ (http://[^}\s]+) \} 
     (?:       
      \[ ([^\]{}\n]+) \]   
     )? 
    #x', 
    "cb_img_markdown", 
    $source); 

function cb_img_markdown($m) { 
    list($asis, $link, $alt) = $m; 
    if (!strlen($alt)) { 
     $alt = "image " . basename($link); 
    } 
    return "![$alt]($link)"; 
} 

您還可以使鏈接匹配更嚴格以避免誤報。在這裏,我只是取決於http://的存在,但您可以附加(?:png|jpe?g|gif)以確保它只匹配圖片網址。

+0

我編輯了答案來顯示Markdown用來匹配的內容![alt](鏈接) – jonnnnnnnnnie 2011-04-29 20:17:12

+0

您複製了錯誤的部分。內聯圖像處理是一個下面的正則表達式。 – mario 2011-04-29 20:23:00

+0

好吧,我已經刪除了它......難怪我弄錯了,謝謝! – jonnnnnnnnnie 2011-04-29 20:30:35

0

這讓忙碌在PHP解析標籤, 我建議你應該使用這個PHP Simple HTML DOM Parser

它是非常容易解析任何種類的標籤,你可以通過屬性也很容易過濾。