首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助preg_replace用参数解释{变量}

需要帮助preg_replace用参数解释{变量}
EN

Stack Overflow用户
提问于 2010-10-05 21:36:08
回答 4查看 217关注 0票数 0

我想替换一下

{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}

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-05 22:17:23

试试这个:

代码语言:javascript
复制
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代码即可。

票数 1
EN

Stack Overflow用户

发布于 2010-10-05 21:47:06

您可能希望使用preg_replace_callback,否则替换可能会变得非常复杂。

代码语言:javascript
复制
preg_replace_callback('/{youtube(.*)}(.*){\/youtube}/iU',...)

在回调中,检查$match[1]中类似于/(width|showborder|height|color1)="([^"]+)"/i模式的内容。一个简单的preg_match_all在一个preg_replace_callback内保持所有部分都是整洁的,最重要的是所有的部分都是清晰的。

票数 1
EN

Stack Overflow用户

发布于 2010-10-05 21:55:13

我会这样做:

代码语言:javascript
复制
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();或者其他东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3867944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档