2013-10-04 67 views
0

我有一個簡單的函數,它解析短代碼標籤及其屬性, ,但它在輸出中有一些問題。PHP - 簡單的短代碼解析器,輸出順序錯誤

一樣,這是我content在裏面坐了一個簡碼的字符串:

$content = 'This is lorem ispium test [gallery image="10"] and text continues...' 

我想要的結果輸出是這樣的:

This is lorem ispium test 
---------------------------------------------- 
|  This is output of gallery   | 

----------------------------------------------- 
and text continues... 

但現在簡碼未呈現,其中短碼被調用,而不是在頂部顯示這個短代碼。像:

---------------------------------------------- 
    |  This is output of gallery   | 

    ----------------------------------------------- 
    This is lorem ispium test and text continues... 

請告訴我該如何使簡碼在那裏,它被稱爲

function shortcode($content) { 

    $shortcodes = implode('|', array_map('preg_quote', get('shortcodes'))); 
    $pattern = "/(.?)\[($shortcodes)(.*?)(\/)?\](?(4)|(?:(.+?)\[\/\s*\\2\s*\]))?(.?)/s"; 

    echo preg_replace_callback($pattern, array($this,'handleShortcode'), $content); 
} 

function handleShortcode($matches) { 

    $prefix = $matches[1]; 
    $suffix = $matches[6]; 
    $shortcode = .$matches[2]; 

    // allow for escaping shortcodes by enclosing them in double brackets ([[shortcode]]) 
    if($prefix == '[' && $suffix == ']') { 
     return substr($matches[0], 1, -1); 
    } 

    $attributes = array(); // Parse attributes into into this array. 

    if(preg_match_all('/(\w+) *= *(?:([\'"])(.*?)\\2|([^ "\'>]+))/', $matches[3], $match, PREG_SET_ORDER)) { 
     foreach($match as $attribute) { 
      if(!empty($attribute[4])) { 
       $attributes[strtolower($attribute[1])] = $attribute[4]; 
      } elseif(!empty($attribute[3])) { 
       $attributes[strtolower($attribute[1])] = $attribute[3]; 
      } 
     } 
    } 
    //callback to gallery 
    return $prefix. call_user_func(array($this,$shortcode), $attributes, $matches[5], $shortcode) . $suffix; 
} 


function gallery($att, $cont){ 
    //gallery output 
} 

請注意:這是不相關的WordPress的,它是一個自定義腳本。

+0

我想'簡碼()'是OP的入口點,這是應該'echo' ... – mavrosxristoforos

+0

是@mavrosxristoforos是正確 – user007

+0

請考慮添加你的'畫廊'功能的部分 – mavrosxristoforos

回答

1

我相信問題可能在你的function gallery($att, $cont)
如果該功能使用echoprint而不是return,那麼在實際內容出現之前顯示它是非常有意義的。

編輯
如果你不能改變庫代碼,那麼,你可以使用output buffering

function handleShortcode($matches) { 
    ... 
    ob_start(); 
    call_user_func(array($this,$shortcode), $attributes, $matches[5], $shortcode); 
    $gallery_output = ob_get_contents(); 
    ob_end_clean(); 

    return $prefix . $gallery_output . $suffix; 
} 

相關閱讀:
PHP ob_start
PHP ob_get_contents

+0

是在'畫廊'功能內有一個回聲,我不能改變它,因爲它是核心功能..該怎麼辦?我可以使用緩衝區嗎? – user007

+1

更新了我的答案,以反映您可以做什麼,因爲圖庫功能無法更改。 – mavrosxristoforos

+0

Thnaks,這非常有幫助 – user007