Я хочу удалить только iframe (и все внутри iframe) с помощью facebook, как указано выше, но сохранить iframe youtube:

<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>

Чтобы убрать фреймы с 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

2
1mnumb1 29 Фев 2016 в 22:33

2 ответа

Лучший ответ

Итак, вы примерно пытаетесь проверить, присутствует ли www.facebook.com в <ifram> или нет. Это может быть достигнуто с помощью следующего регулярного выражения.

Регулярное выражение: (?=.*www\.facebook\.com.*)<iframe .*<\/iframe>

Объяснение:

  • (?=.*www\.facebook\.com.*) проверяет наличие www.facebook.com между тегами <iframe>.

Regex101 Demo

2
user2705585user2705585 29 Фев 2016 в 19:45

Лучше воспользуйтесь подходом 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);
6
Jan 29 Фев 2016 в 19:54