Pytanie w sprawie php, regex – Jak mogę usunąć element HTML i jego zawartość za pomocą RegEx

6

Mam identyfikator div, który chce usunąć z wyjścia, które wygląda

<div id="ithis" class="cthis">Content here which includes other elements etc..) </div>

Jak mogę usunąć ten div i wszystko w nim używając PHP i regex?

Dziękuję Ci.

znasz nazwę id i / lub nazwę klasy? Czy też istnieją jakieś odrębne identyfikatory id i / lub klasy, dzięki czemu nie usuniesz wszystkich div wchodzących w ten opis? Czy chcesz usunąć wszystkie divy i ich zawartość? Justin Giboney
Czy możesz dalej opracować? Czy to w formie sznurka? Ian Elliott

Twoja odpowiedź

3   odpowiedź
1

Nie wiem o PHP, ale możesz go zastąpić/<id.*?<\/id[^>]*>/ z niczym.

13

Prosta odpowiedź brzmi: nie. Zamiast tego używasz jednego z wielu parserów HTML PHP. Regexes to niestabilny i podatny na błędy sposób manipulowania HTML.

Powiedziawszy to, możesz to zrobić:

$html = preg_replace('!<div\s+id="ithis"\s+class="cthis">.*?</div>!is', '', $html);

Alewiele z tym może być źle. Na przykład, jeśli zawiera div:

<div id="ithis" class="cthis">Content here which <div>includes</div> other elements etc..) </div>

otrzymasz:

 other elements etc..) </div>

gdy regex zatrzyma się na pierwszym</div>. I nie ma nic, co można naprawdę zrobić, aby rozwiązać ten problem (z wyrażeniami regularnymi) konsekwentnie.

Wykonane za pomocą parsera wygląda to bardziej tak:

$doc = new DOMDocument();
$doc->loadHTML($html);
$element = $doc->getElementById('ithis');
$element->parentNode->removeChild($element);
$html = $doc->saveHTML();
+1. Warto skomentować, że (A) Jeśli element nie istnieje, to$element jestNULL i->removeChild() polecenie zakończy się niepowodzeniem z błędem krytycznym i (B) możesz / możesz chcieć użyć@ spowodować->loadHTML() uciszyć wszelkie powiadomienia o zniekształconym kodzie HTML:@$doc->loadHTML($html); cale_b
0

PHP jest po stronie serwera, a dane wyjściowe pochodzą z serwera. Nie możesz po prostu tego nie wydrukować? A może chcesz to ukryć? Jeśli tak, w arkuszu stylów po prostu powiedz#ithis {display:none}.

Jeśli łańcuch jest zwrotem z jakiejś funkcji w PHP, której jeszcze nie napisałeś ORAZ nie chcesz zmarnować tego kodu, musisz napisać bardzo trudny wyrażeń regularnych, aby uwzględnić zagnieżdżone div, zmienną składnię na wyjściu itp. . Polecam używanie parsera (być może tegoKomponent Zend Framework), aby ci pomóc. Użyłem tego kilka razy do czegoś podobnego. Chociaż w ogóle nie znasz ZF, możesz spróbować czegoś innego.

Powiązane pytania