为CMS创建自定义“html”标签?

问题描述:

我正在使用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

我已经写了一个类,它完全符合你对我自己的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

我不是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