PHP:只在div中包装iframe一次

时间:2018-01-19 20:09:06

标签: php html iframe str-replace

我刚刚注意到我处理用户故事发布的部分代码无法正常运行。

每当用户的帖子中有iframe(例如YouTube嵌入式视频)时,我的PHP脚本会将iframe包装在像<div class="embed-responsive embed-responsive-16by9">这样的div中。

我使用的代码很简单:

$content = str_replace(['<iframe', '</iframe>'], ['<div class="embed-responsive embed-responsive-16by9"><iframe', '</iframe></div>'], $content);

问题在于,当对这篇文章进行更改时,在后台使用ajax执行相同的PHP代码,iframe再次包装在这个div中,这就是这样的

<div class="embed-responsive embed-responsive-16by9">
    <div class="embed-responsive embed-responsive-16by9">
        <iframe ...></iframe>
    </div>
</div>

我一直在考虑这个问题并且解决方案可能非常简单,但如果iframe已经包含在embed-responsive类的div中,我该如何检查PHP?

2 个答案:

答案 0 :(得分:0)

如果您使用$content规范化现有的iframe,则无需检测帧是否已经包装:

    $content = str_replace(['<div class="embed-responsive embed-responsive-16by9"><iframe', '</iframe></div>'], ['<iframe', '</iframe>'], $content);

$content中的所有iframe现在都会删除div个部分。现在执行你已经拥有的str_replace来再次包装iframe:

    $content = str_replace(['<iframe', '</iframe>'], ['<div class="embed-responsive embed-responsive-16by9"><iframe', '</iframe></div>'], $content);

div部分已再次添加到框架中,您最终只能将所有iframe包裹一次。

答案 1 :(得分:0)

您可能必须检查iframe是否已有父级。这可以通过在第一次更换时添加一个类来完成,然后在替换中使用它作为条件

if(strpos($content,'class="i-wrapped" ')!== false ){
    //the iframe has not been wrapped
    $content = str_replace(
        ['<iframe', '</iframe>'], 
        ['<div class="embed-responsive embed-responsive-16by9">'.
         '<iframe class="i-wrapped"', '</iframe></div>'],
        $content);
}else { /*already wrapped*/}

现在有一些像这样的解决方案需要注意,如果你在帖子中有多个iFrame,这个解决方案会失败

另一种选择可能是计算iframe的出现次数,然后以那种方式执行替换