2009-07-11 1 views
6

У меня есть DIV идентификатор нравится, чтобы удалить из выхода, который выглядит какКак я могу удалить HTML элемент и его содержимое с помощью RegEx

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

Как я могу удалить этот DIV и все, что в нем с помощью PHP и регулярные выражения ?

спасибо.

+0

Можете ли вы уточнить? Это в виде строки? –

+1

Знаете ли вы имя и/или имя класса? Или есть ли какие-либо отдельные идентификаторы id и/или класса, чтобы вы не удаляли все div, попадающие в это описание? Или вы хотите удалить все div и их содержимое? –

ответ

13

Простой ответ заключается в том, что вы этого не делаете. Вместо этого вы используете один из PHP-парсеров PHP. Regexes - уязвимый и подверженный ошибкам способ манипулирования HTML.

Это сказанное вы можете сделать это:

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

Но многих вещей могут неправильно с этим. Например, если содержит DIV:

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

вы в конечном итоге с:

other elements etc..) </div> 

как регулярное выражение остановится на первом </div>. И нет, вы ничего не можете сделать, чтобы решить эту проблему (с регулярными выражениями) последовательно.

Done с анализатором это выглядит примерно так:

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$element = $doc->getElementById('ithis'); 
$element->parentNode->removeChild($element); 
$html = $doc->saveHTML(); 
+0

+1. Стоит прокомментировать, что (A) Если элемент не существует, то '$ element' является' NULL', а команда '-> removeChild()' терпит неудачу с фатальной ошибкой и (B) вы можете/можете захотеть использовать '@', чтобы вызвать '-> loadHTML()', чтобы отключить любые уведомления о некорректном HTML: '@ $ doc-> loadHTML ($ html);' –

1

Я не знаю о PHP, но вы можете заменить /<id.*?<\/id[^>]*>/ ничего.

0

PHP - это серверная часть, а вывод поступает с сервера. Разве вы не можете просто вывести его? Или вы пытаетесь скрыть это? Если да, то в таблице стилей просто скажите #ithis {display:none}.

Если строка является возвратом от какой-либо функции в PHP, которую вы не написали, и вы не хотите гадать с этим кодом, вам нужно написать очень сложное регулярное выражение для учета вложенного div, изменяющегося синтаксиса в выход и т. д. Я бы рекомендовал использовать некоторый парсер (возможно, этот Zend Framework component), чтобы помочь вам. Я использовал его несколько раз для чего-то подобного. Хотя, если вы вообще не знакомы с ZF, вы можете попробовать что-то еще.

Смежные вопросы