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

3

我在使用一个基于PHP的CMS开发Web应用程序。这个CMS需要缩短插入(嵌入)视频等内容的过程,比如从YouTube或Vimeo嵌入视频,只需要编写以下代码即可存储到数据库中:

<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中实现这个功能?


根据CMS的不同,以及它是否已经支持此功能或者您需要从头开始构建。无论如何,您可能希望使用除HTML标记分隔符之外的其他东西来包装您的“标记”,否则解析和替换将非常缓慢。我强烈推荐使用[]{},后者在PHP模板工具中尤其常见。 - cHao
这将全部用于自定义CMS。我确信可以使用一些[] / {}括号来实现,但我不确定如何进行替换。您能否举个例子? - Industrial
2个回答

12
我已经为自己的CMS编写了一个类,可以完全满足您的需求。尽管我从未发布过它,但我已经将源代码发布在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 函数:tags/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>

@buggedcom 这听起来非常有趣。在这里编辑示例代码将为未来的提问者提供快速比较。 - Pekka
4
我刚刚测试了一个示例脚本,比较了simpleHTMLDom和CustomTags,结果如下:simpleHTMLDom所用时间为0.0057680606842秒,内存使用量为0.608268737793 MB,内存峰值为0.654273986816 MB。CustomTags所用时间为0.00264501571655秒,内存使用量为0.452098846436 MB,内存峰值为0.518165588379 MB。结果表明,性能方面Custom Tags稍微更好一些,因此我会选择它,除非你需要simpleHTMLDom的其他特定功能。 - buggedcom
我一直在考虑进行适当的发布,但一直没有时间。它具有提供跨CMS功能的巨大潜力,例如视频标签、swf标签等等。总有一天我会抽出时间来完成它... - buggedcom
我遇到了一个非常类似的问题,并且这看起来可能是我一直在寻找的解决方案。现在如果我能在你发布它的7月份找到它就好了... - Snekse
这也听起来非常有趣。在工作中使用Java之类的东西,现在正在寻找PHP的替代方案。我喜欢在标签文件中隐藏后端代码的能力。 - Intellix

3
我不确定它如何对非标准标签做出反应,但如果它有效,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}、正则表达式等等。
我从未尝试过这种方法,现在也没有时间测试它,但如果你决定尝试一下,我很想知道这种方法是否有用。

它应该能够正常工作,因为Simple DOM将解析XML而不仅仅是HTML,尽管它的名称如此。我已经按照您描述的方式使用了简单的内容替换处理引擎,尽管我使用了具有特定类的span,并在包含HTML注释中指定了参数。 - nikc.org
它确实可以工作。我进行了比较,发现它运行良好,但是它使用的资源略多于自定义标签,这可能是因为自定义标签专门旨在提供特定级别的功能,所以除非你需要它,否则我会选择CustomTags。 - buggedcom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接