我刚刚注意到我处理用户故事发布的部分代码无法正常运行。
每当用户的帖子中有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?
答案 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的出现次数,然后以那种方式执行替换