2013-02-06 116 views
2

Ive得到了如下功能都包装iframe的在一个div类=“视频容器”PHP/WordPress的的preg_match

我想要的目标仅包含一个src与SRC =“www.youtube开始的I帧

有没有修改这个功能做更具体的办法?在此先

感谢。

function div_wrapper($content) { 
// match any iframes 
$pattern = '~<iframe.*</iframe>~'; 
preg_match_all($pattern, $content, $matches); 

foreach ($matches[0] as $match) { 
    // wrap matched iframe with div 
    $wrappedframe = '<div class="video-container">' . $match . '</div>'; 

    //replace original iframe with new in content 
    $content = str_replace($match, $wrappedframe, $content); 
} 

return $content;  
} 
add_filter('the_content', 'div_wrapper'); 
+0

'if(!condition)continue;'在foreach中作为第一行。使条件成为目标条件(src以任何形式开始) – Patashu

回答

0

执行懒惰匹配(*?)和c哎呀,如果你正在寻找的字符串是在其中:

// match any iframes 
$pattern = '~<iframe.*?</iframe>~'; 
$content = preg_replace_callback($pattern, function($matches){ 

    if(strpos($matches[0], 'youtube') !== false) 
    return '<div class="video-container">' . $matches[0] . '</div>'; 

    return $matches[0]; 

}, $content); 

不用说,这在许多情况下将失败。如果你想要的东西可靠地使用XML解析器(见DomDocument::getElementsByTagNameDomElement::getAttribute

您也可以尝试风格的伪选择您喜欢的iframe或:before:after。这样,你并不需要一个包装元素(如:iframe[src~=youtube]:after

+0

啊,是的,我没有想到使用伪的来包装iframe。我给他们一个去。 – user1385827

+0

:在伪元素之前将不会工作根据我的测试和这篇文章http://stackoverflow.com/a/13056674/1385827 – user1385827

+0

上面提供的PHP youve工程。我不知道你为什么说在很多情况下会失败?再次感谢你的帮助。 – user1385827

0

我想你只需要改变$pattern变量与尝试。

$pattern = '~<iframe.*src*=\'.*(http\:?)*\/\/*(www\.?)*youtube\..*</iframe>~'; 

注:作为@alex指出,你缺少的协议,所以它应该是http://youtube.//youtube.http://www.youtube.

+0

它不应该工作,因为缺少协议将意味着'iframe'将无法正常工作。 – alex

+0

@alex:谢谢指出,我忘了,因为不在问题中...更新 –

+0

我不认为你想要在角色类。如果它是可选的,请使用括号来包装它。 – alex