Вопрос по php, regex – Как я могу удалить элемент HTML и его содержимое с помощью RegEx

6

У меня есть идентификатор div, как удалить из вывода, который выглядит как

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

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

Спасибо.

Можете ли вы уточнить? Это в форме строки? Ian Elliott
Вы знаете имя и / или имя класса? Или есть какие-либо отличительные идентификаторы идентификатора и / или класса, чтобы вы не удаляли все элементы div, попадающие в это описание? Или вы хотите удалить все div и их содержимое? Justin Giboney

Ваш Ответ

3   ответа
13

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

При этом вы можете сделать это:

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

Ноmany все может быть не так с этим. Например, если это содержит div:

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

Вы получите:

 other elements etc..) </div>

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

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

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

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

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

1

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

Похожие вопросы