Я работаю с CMS для веб-приложения на PHP, у которого есть потребность в сокращении процесса вставки (встраивания) материала, такого как видео с 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&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. Пользовательские теги
Это в основном позволяет делать то, что вы просите. В классе есть некоторые примеры пользовательских тегов, поэтому я не буду вставлять код здесь. Дайте мне знать, как вы идете.
Изменить 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>
Я не уверен на 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">
, даже с возможностью добавления подтег для структурированной информации вместо kludgy {placeholder}
s и regexes и так далее.
Я никогда не пробовал этого, и у меня нет времени, чтобы проверить это прямо сейчас, но если вы решите попробовать, мне было бы интересно узнать, оказался ли этот способ полезным.