我想替换一下
{youtube}Video_ID_Here{/youtube}
一个youtube视频的嵌入代码。
到目前为止我已经
preg_replace('/{youtube}(.*){\/youtube}/iU',...)
而且效果很好。
但是现在我想解释像高度,宽度等参数,所以我能有一个参数吗,不管is是否有参数?它应该能把下面的所有这些.
{youtube height="200px" width="150px" color1="#eee" color2="rgba(0,0,0,0.5)"}Video_ID_Here{/youtube}
{youtube height="200px"}Video_ID_Here{/youtube}
{youtube}Video_ID_Here{/youtube}
{youtube width="150px" showborder="1"}Video_ID_Here{/youtube}
发布于 2010-10-05 22:17:23
试试这个:
function createEmbed($videoID, $params)
{
// $videoID contains the videoID between {youtube}...{/youtube}
// $params is an array of key value pairs such as height => 200px
return 'HTML...'; // embed code
}
if (preg_match_all('/\{youtube(.*?)\}(.+?)\{\/youtube\}/', $string, $matches)) {
foreach ($matches[0] as $index => $youtubeTag) {
$params = array();
// break out the attributes
if (preg_match_all('/\s([a-z0-9]+)="([^\s]+?)"/', $matches[1][$index], $rawParams)) {
for ($x = 0; $x < count($rawParams[0]); $x++) {
$params[$rawParams[1][$x]] = $rawParams[2][$x];
}
}
// replace {youtube}...{/youtube} with embed code
$string = str_replace($youtubeTag, createEmbed($matches[2][$index], $params), $string);
}
}此代码首先匹配{youtube}.{/youtube}标记,然后将属性拆分为数组,将它们(作为键/值对)和视频ID传递给函数。只需填写函数定义,使其验证您希望支持的params,并构建适当的HTML代码即可。
发布于 2010-10-05 21:47:06
您可能希望使用preg_replace_callback,否则替换可能会变得非常复杂。
preg_replace_callback('/{youtube(.*)}(.*){\/youtube}/iU',...)在回调中,检查$match[1]中类似于/(width|showborder|height|color1)="([^"]+)"/i模式的内容。一个简单的preg_match_all在一个preg_replace_callback内保持所有部分都是整洁的,最重要的是所有的部分都是清晰的。
发布于 2010-10-05 21:55:13
我会这样做:
preg_match_all("/{youtube(.*?)}(.*?){\/youtube}/is", $content, $matches);
for($i=0;$i<count($matches[0]);$i++)
{
$params = $matches[1][$i];
$youtubeurl = $matches[2][$i];
$paramsout = array();
if(preg_match("/height\s*=\s*('|\")([0-9]+px)('|\")/i", $params, $match)
{
$paramsout[] = "height=\"{$match[2]}\"";
}
//process others
//setup new code
$tagcode = "<object ..." . implode(" ", $paramsout) ."... >"; //I don't know what the code is to display a youtube video
//replace original tag
$content = str_replace($matches[0][$i], $tagcode, $content);
}您只需在"{youtube“和"}”之后查找对角,但您可以对XSS问题敞开心扉。最好的方法是查找特定数量的参数并对其进行验证。不要让< and >之类的东西在标记中传递,因为有人可以放do_something_nasty();或者其他东西。
https://stackoverflow.com/questions/3867944
复制相似问题