2010-07-10 125 views
3

我正在使用PHP中的一個web應用程序的CMS,它需要縮短插入(嵌入)東西的過程,比如來自youtube或vimeo的視頻,通過以下操作存儲在數據庫中:爲CMS創建自定義「html」標籤?

<youtube id="wfI0Z6YJhL0" /> 

以下後某種更換哪個將輸出:

<!-- Custom formatting before object !--> 
<object width="640" height="385"><param name="movie" value="http://www.youtube-nocookie.com/v/wfI0Z6YJhL0&amp;hl=sv_SE&amp;fs=1?rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/wfI0Z6YJhL0&amp;hl=sv_SE&amp;fs=1?rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object> 
<!-- Custom formatting after object !--> 

我怎麼能在PHP這樣做呢?

+0

取決於CMS上,以及它是否甚至支持這樣的事情已經或者你就必須從頭開始構建它。然而,你這樣做,你可能會想使用除HTML標籤分隔符之外的東西來環繞你的「標籤」,否則解析和替換將會很慢。我強烈建議'']'或'{}',後者在PHP模板工具中特別常見。 – cHao 2010-07-10 16:50:52

+0

它將全部用於自定義cms中。我正如你所說的那樣,確定它可以用一些[]/{}括號來做,但我不知道如何做替換。你願意舉個例子嗎? – Industrial 2010-07-10 16:56:25

回答

11

我已經寫了一個類,它完全符合你對我自己的cms的要求。我已經爲你上傳了src,儘管我從未發佈它,但它的源代碼是在BSD樣式許可下發布的。 Custom Tags

它基本上可以讓你做你想要的東西。在這個類中有一些自定義標籤的例子,所以我不會在這裏粘貼代碼。讓我知道你怎麼去。

編輯1:請求的示例代碼。 :-)

編輯2:我應該添加它支持埋藏的自定義標籤。

編輯3:它還支持在線模板和標記替換,即

<ct:inline some="attribute"> 
    This is an in line template. <br /> 
    This is a #{tag} that can be accessed by the callback function 
</ct:inline> 

PHP/HTML:使用example.php

<?php 

$current_dir = dirname(__FILE__).DIRECTORY_SEPARATOR; 
require_once dirname($current_dir).DIRECTORY_SEPARATOR.'customtags.php'; 

$ct = new CustomTags(array(
    'parse_on_shutdown'  => true, 
    'tag_directory'   => $current_dir.'tags'.DIRECTORY_SEPARATOR, 
    'sniff_for_buried_tags' => true 
)); 

?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 

<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>untitled</title> 
    <meta name="generator" content="TextMate http://macromates.com/"> 
    <meta name="author" content="Oliver Lillie"> 
    <!-- Date: 2010-07-10 --> 
</head> 
<body> 

    <ct:youtube id="wfI0Z6YJhL0" /> 

</body> 
</html> 

自定義標籤的PHP函數:標籤/youtube/tag.php

function ct_youtube($tag) 
{ 
    return '<object id="'.$tag['attributes']->id.'" value="http://www.youtube.com/v/'.$tag['attributes']->id.'" /><param ......>'; 
} 

輸出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 

<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>untitled</title> 
    <meta name="generator" content="TextMate http://macromates.com/"> 
    <meta name="author" content="Oliver Lillie"> 
    <!-- Date: 2010-07-10 --> 
</head> 
<body> 

    <object id="wfI0Z6YJhL0" value="http://www.youtube.com/v/wfI0Z6YJhL0" /><param ......> 

</body> 
</html> 
+0

@ buggedcom這聽起來很有趣。在這裏編輯示例代碼對於未來提問者的快速比較會很有趣。 – 2010-07-10 17:26:39

+4

我剛剛測試了一個示例腳本,比較了simpleHTMLDom和CustomTags,並且比較如此:simpleHTMLDom - > Time:0.0057680606842秒,Mem Usage:0.608268737793 MB,Mem Usage Peak:0.654273986816 MB。 CustomTags:時間:0.00264501571655秒,內存使用率:0.452098846436 MB,Mem峯值使用率:0.518165588379 MB。原來,自定義標記的性能稍微好一點,所以我會使用它,除非您需要simpleHTMLDom使用的其他細節。 – buggedcom 2010-07-10 17:31:35

+0

+1非常好! - – 2010-07-10 17:40:11

3

我不是100%確定它將如何對非標準標籤作出反應,但如果它能正常工作,simpleHTMLDom將是完美的選擇。

$html = str_get_html('....'); 

然後沿着線的東西...

$element = $html->find('youtube',0); // Finds first element 
             // - use "foreach" loop for final version 
$element->tag = 'object'; 
$element->value = "http://www.youtube.com/v/".$element->id; 
$element->innertext= "<param ......>" 

.... 

echo $html; 

你得到的漂移。

這種方法的優點是,每一個具體的延長可以在乾淨的HTML標記<tagname attribute="value">增加它的數據,與添加子標籤的結構化信息的甚至有可能,而不是缺憾{placeholder} S和正則表達式等。

我從來沒有試過這個,我現在沒有時間去測試它,但是如果你決定嘗試一下,我會很有興趣知道這種方法是否有用。

+0

它應該工作得很好,因爲簡單的DOM將解析XML而不僅僅是HTML,儘管它的名字。我用你描述的方式完成了一個簡單的內容替換處理引擎,儘管我使用了span:s和特定的類,並在包含html註釋中指定了params。 – 2010-07-10 17:12:39

+0

它確實工作我做了一個比較,它工作正常,但是它比自定義標籤使用了更多的資源,大概是因爲自定義標籤專門用於提供特定級別的功能,所以除非您需要它,否則我會使用CustomTags – buggedcom 2010-07-10 17:38:30