为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&hl=sv_SE&fs=1?rel=0&color1=0xe1600f&color2=0xfebd01"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/wfI0Z6YJhL0&hl=sv_SE&fs=1?rel=0&color1=0xe1600f&color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object>
<!-- Custom formatting after object !-->
我怎么能在PHP这样做呢?
我已经写了一个类,它完全符合你对我自己的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>
@ buggedcom这听起来很有趣。在这里编辑示例代码对于未来提问者的快速比较会很有趣。 – 2010-07-10 17:26:39
我刚刚测试了一个示例脚本,比较了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
+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和正则表达式等。
我从来没有试过这个,我现在没有时间去测试它,但是如果你决定尝试一下,我会很有兴趣知道这种方法是否有用。
它应该工作得很好,因为简单的DOM将解析XML而不仅仅是HTML,尽管它的名字。我用你描述的方式完成了一个简单的内容替换处理引擎,尽管我使用了span:s和特定的类,并在包含html注释中指定了params。 – 2010-07-10 17:12:39
它确实工作我做了一个比较,它工作正常,但是它比自定义标签使用了更多的资源,大概是因为自定义标签专门用于提供特定级别的功能,所以除非您需要它,否则我会使用CustomTags – buggedcom 2010-07-10 17:38:30
取决于CMS上,以及它是否甚至支持这样的事情已经或者你就必须从头开始构建它。然而,你这样做,你可能会想使用除HTML标签分隔符之外的东西来环绕你的“标签”,否则解析和替换将会很慢。我强烈建议'']'或'{}',后者在PHP模板工具中特别常见。 – cHao 2010-07-10 16:50:52
它将全部用于自定义cms中。我正如你所说的那样,确定它可以用一些[]/{}括号来做,但我不知道如何做替换。你愿意举个例子吗? – Industrial 2010-07-10 16:56:25