正则表达式使用Facebook删除iframe,但保留YouTube


Regex to remove iframe with facebook but keeps youtube

我想像上面一样用Facebook只删除iframe(以及iframe内的所有内容),但要保留youtube iframe:

<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.example.com%2F%3Fp%313098&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=recommend&amp;colorscheme=light" ></iframe>

要阻止 iframe 从 YouTube 上获取:

<iframe width="640" height="360" src="https://www.youtube.com/embed/hiYtWYLEjlI?rel=0" frameborder="0" allowfullscreen></iframe>

我有这个正则表达式,但它只会删除

<'/*i(?:frame|layer)|l(?:ayer|ink)[^>]*+>

https://regex101.com/r/eM9eS3/5

最好采用xpath方法:

$xml = simplexml_load_string($your_html_string);
$iframes = $xml->xpath("//iframe[contains(@src, 'facebook.com')]");

并删除这些:

for ($i=0;$i<count($iframes);$i++) {
    $iframe = $iframes[$i];
    unset($iframe[0][0]);
}

您的新 XML 如下所示:

echo $xml->asXML();

作为整个功能:

function goAwayFacebook($html) {
    $xml = simplexml_load_string($html);
    $iframes = $xml->xpath("//iframe[contains(@src, 'facebook.com')]");
    for ($i=0;$i<count($iframes);$i++) {
        $iframe = $iframes[$i];
        unset($iframe[0][0]);
    }
    return $xml->asXML();
}
$newhtml = goAwayFacebook($html);
因此,

您粗略地尝试检查www.facebook.com是否存在于<ifram>中。这可以使用以下正则表达式来实现。

正则表达式:(?=.*www'.facebook'.com.*)<iframe .*<'/iframe>

解释:

  • (?=.*www'.facebook'.com.*)检查<iframe>标记之间是否存在www.facebook.com

正则表达式 101 演示