PHP:只在 div 中包装一次 iframe



我刚刚注意到处理用户故事发布的代码的一部分无法按应有的方式运行。

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

我为此使用的代码很简单:

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

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

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

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

您可能需要

检查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,这个解决方案会失败

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

如果您使用

以下命令规范化$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。

最新更新