2013-02-15 6 views
0

Мне нужна помощь. Я просмотрел регулярное выражение, но еще не понял его реализации. Мне нужен фрагмент, который удалит все теги и их дочерние элементы, если родительский элемент содержит указанные классы или идентификаторы.PHP: удалить все теги, которые содержат данный класс или id

Пример:

<?php 

function remove_tag($find="",$html) 
{ 
    # Remove multiple #IDs and classes at once 

    # When given a string (separating objects with a comma) 
    if (is_string($find)) 
    { 
     $objects = explode(',', str_replace(' ', '', $find); 
    } else if (is_array($find)) { 
     $objects = $find; 
    } 

    foreach ($objects as $object) 
    { 
     # If ID 
     if (substr($object,0,1) == '#') 
     { 
      # regex to remove an id 
      # Ex: '<ANYTAG [any number of attributes] id='/"[any number of ids] NEEDLE [any number of ids]'/" [any number of attributes]>[anything]</ENDTAG [anything]>' 

     } 

     if (substr($object,0,1) == '.') 
     { 
      # remove a class 
      # Ex: '<ANYTAG [any number of attributes] class='/"[any number of classes] NEEDLE [any number of classes]'/" [any number of attributes]>[anything]</ENDTAG [anything]>' 
     } 

     # somehow remove it from the $html variable? 
    } 
} 

Извините, если это новичок вопрос, спасибо за ваше время! :)

-Pat

+2

Если вы проанализируете HTML с регулярным выражением, он придет http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+1

Как мне показалось, хотя я сначала не согласился, простое регулярное выражение не является надежным способом разбора HTML. Всегда будут глюки. Поэтому, если этот разобранный код вводится пользователем, используйте http://htmlpurifier.org/. –

+0

Хм ... Вы хотите удалить класс или удалить элемент? Итак, вы хотите, чтобы

стал
(удалив класс classNumberOne)? Или вы хотите, чтобы элемент, который имеет данный класс, просто скрывался? Не имея полного понимания того, чего вы хотите достичь, я, вероятно, сделаю это в javaScript (если бы я понял, чего вы хотите). Что-то вдоль линий getElementById и помещает дисплей стиля: none; в теме. Извините, если я неправильно понял ваш вопрос ... Я пробовал. :-) – Zeth

ответ

2

Вы можете использовать вместо регулярных выражений, XPath, чтобы найти все элементы в документе, который вы хотите удалить.

DOMDocument и XPath показалось бы хорошим началом для меня.

Вы можете использовать метод DOMNode::removeChild() для удаления ребенка и класс DOMXPath для оценки XPath, чтобы получить узлы, которые необходимо удалить.