php удалить тег с классом и его содержимым - PullRequest
0 голосов
/ 18 мая 2018

поэтому у меня был этот html

<html>
<head>...</head>
<body>
(some js and css)
    <div class="no_remove">(content)</div>
    <div class="no_remove">(content that i didn't want to remove)
        <div class="remove">
            <span>(content)</span>
            <span>(content)</span>
            <span>(content)</span>
            <div class="other1">(content)</div>
            <div class="other2">(content)</div>
            <div class="other3">(content)</div>
        </div>
    </div>
</body>
</html>

и php

$text = file_get_contents($link);
$dom = new DOMDocument();
$dom->loadHTML($text);
$xpath = new DOMXPath($dom);
$div = $xpath->query('//div[@class="no_remove"]');
$result = $dom->saveXML($div->item(1));
$result2 = preg_replace('#<div class="remove">(.*?)</div>#', ' ', $result);
echo $result2;

dom xpath отлично справился со своей работой,
но «preg_replace» не удалил div с классом »удалить "
Могу ли я получить просветление от мастера регулярных выражений или других, которые могут?

извините, плохой английский

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вот как вы продолжаете использовать правильный инструмент - используйте DomDocument / Xpath, чтобы удалить нежелательный div на основе имени класса: (не прибегайте к регулярному выражению)

Код: ( Демо )

$html = <<<HTML
<html>
<head>...</head>
<body>
(some js and css)
    <div class="no_remove">(content)</div>
    <div class="no_remove">(content that i didn't want to remove)
        <div class="remove">
            <span>(content)</span>
            <span>(content)</span>
            <span>(content)</span>
            <div class="other1">(content)</div>
            <div class="other2">(content)</div>
            <div class="other3">(content)</div>
        </div>
    </div>
</body>
</html>
HTML;

libxml_use_internal_errors(true);
$dom=new DOMDocument; 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach($xpath->query('//div[@class="remove"]') as $div) {
    $div->parentNode->removeChild($div);
}
echo $dom->saveHTML();

Выход:

<html>
<head></head><p>...
</p><body>
(some js and css)
    <div class="no_remove">(content)</div>
    <div class="no_remove">(content that i didn't want to remove)

    </div>
</body>
</html>
0 голосов
/ 18 мая 2018

Скорее всего, вам нужно указать многострочный модификатор, т. Е. s

$result2 = preg_replace('#<div class="remove">(.*?)</div>#s', ' ', $result);

Или вы можете использовать [\s\S] вместо . для сопоставления по нескольким строкам.Итак,

$result2 = preg_replace('#<div class="remove">([\s\S]*?)</div>#', ' ', $result);

Кроме того, я бы обычно использовал \s+ вместо добавления пробела, на случай, если html имеет несколько пробелов, например:

$result2 = preg_replace('#<div\s+class="remove">([\s\S]*?)</div>#', ' ', $result);

Вы можететакже попробуйте что-нибудь подобное для обработки нескольких атрибутов и других типов кавычек:

$result2 = preg_replace('#<div\b[^>]+\bclass\s*=\s*[\'\"]remove[\'\"][^>]*>([\s\S]*?)</div>#', ' ', $result);

* БЫСТРОЕ РЕДАКТИРОВАНИЕ: я добавил \b, чтобы идентифицировать границу слова, поэтому такой атрибут, как data-class won 'вместо атрибута class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...