Pergunta sobre regex, php – Como posso remover um elemento html e seu conteúdo usando o RegEx

6

Eu tenho um id div gostaria de remover de uma saída que parece

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

Como posso remover este div e tudo dentro dele usando PHP e regex?

Obrigado.

Você pode elaborar mais? Isso é na forma de uma string? Ian Elliott
você conhece o nome do id e / ou o nome da classe? Ou há algum identificador distinto do id e / ou classe para que você não remova todos os divs que caem nessa descrição? Ou você deseja remover todos os divs e seu conteúdo? Justin Giboney

Sua resposta

3   a resposta
1

/<id.*?<\/id[^>]*>/ com nada.

0

não pode simplesmente não dar saída? Ou você está tentando esconder isso? Se assim for, em uma folha de estilo, basta dizer#ithis {display:none}.

Se a string é um retorno de alguma função em PHP que você não tenha escrito E você não quer mexer com esse código, você tem que escrever um regex muito difícil para considerar divs aninhadas, variando a sintaxe na saída, etc Eu recomendo usar algum parser (talvez issoComponente do Zend Framework) para ajudá-lo. Eu usei algumas vezes para algo similar. Embora se você não estiver familiarizado com a ZF, você pode querer tentar outra coisa.

13

ores de HTML do PHP. Regexes são uma maneira esquisita e propensa a erros de manipulação de HTML.

Dito isto, você pode fazer isso:

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

Masmuitos as coisas podem estar erradas com isso. Por exemplo, se isso contiver um div:

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

você vai acabar com:

 other elements etc..) </div>

como o regex vai parar no primeiro</div>. E não há nada que você possa realmente fazer para resolver este problema (com expressões regulares) de forma consistente.

Feito com um analisador, parece mais com isso:

$doc = new DOMDocument();
$doc->loadHTML($html);
$element = $doc->getElementById('ithis');
$element->parentNode->removeChild($element);
$html = $doc->saveHTML();
+1. Vale a pena comentar que (A) Se o elemento não existe, então$element éNULL e a->removeChild() comando irá falhar com um erro fatal, e (B) você pode / pode querer usar o@ para causar o->loadHTML() para silenciar quaisquer avisos sobre HTML mal formado:@$doc->loadHTML($html); cale_b

Perguntas relacionadas