2013-06-10 5 views
1

Я пытаюсь написать preg_replace, который очистит все свойства тегов разрешенных тегов и все теги, которые не существуют в разрешенном списке.Очистка содержимого внутри html-тегов

Basic ПРИМЕР- это:

<p style="some styling here">Test<div class="button">Button Text</div></p> 

бы оказаться:

<p>test</p> 

Я это работает хорошо .. для IMG-теги и теги A HREF исключением. Мне не нужно очищать свойства img и тегов. Возможно, другие. Я не был уверен, есть ли способ установить два списка разрешений?

1) Один список тегов, которые можно оставить после очистки
2) Один список для тегов, которые разрешены, но оставлены в покое?
3) Остальные удаляются.

Вот сценарий, я работаю над:

$string = '<p style="width: 250px;">This is some text<div class="button">This is the button</div><br><img src="waves.jpg" width="150" height="200" /></p><p><b>Title</b><br>Here is some more text and <a href="#" target="_blank">this is a link</a></p>'; 

$output = strip_tags($string, '<p><b><br><img><a>'); 
$output = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i", '<$1$2$3$4$5>', $output); 

echo $output; 

Этот скрипт должен очистить $ строку быть:

<p>This is some text<br><img src="waves.jpg" width="150" height="200" /></p><p><b>Title</b><br>Here is some more text and <a href="#" target="_blank">this is a link</a></p> 
+2

Использование DOM парсер. – Brad

+3

Пожалуйста, воздержитесь от разбора HTML с помощью RegEx, поскольку он [приведет вас в į̷̷͚̤̤̖̦͍͗̒̈̅̄n̨͖͓̹͍͎͔͈̝͐ͪ͛̄͛ṣ̷̵̞̦ͤ̅̉̋ͪ͑͛ͥ͜a̷̘͖̮͔͎͛̇̏̒͆̆͘n͇͔̤̼͙̩͖̭ͤ͋̉͌͟eͥ͒͆ͧͨ̽͞҉̹͍̳̻͢] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454). Вместо этого используйте [HTML-парсер] (http://stackoverflow.com/questions/292926/robust-mature-html-parser-for-php). – bwoebi

+0

Любые предложения относительно того, какой и, возможно, простой пример кода? Я ссылался на ссылки, которые вы поместили, но есть так много информации и так много вариантов, которые я просто потерял ... Кажется, что эти парсеры должны получать информацию между тегами элементов. Я не пытаюсь это сделать (если я не понимаю). Я пытаюсь очистить свойства в открывающем теге. – John

ответ

1

http://ideone.com/aoOOUN

Эта функция удалит элемент запрещен подэлементы, очистить его «разделенные» подэлементы и оставить остальные (рекурсивно).

function clean($element, $allowed, $stripped){ 
    if(!is_array($allowed) || ! is_array($stripped)) return; 
    if(!$element)return; 
    $toDelete = array(); 
    foreach($element->childNodes as $child){ 
     if(!isset($child->tagName))continue; 
     $n = $child->tagName; 
     if ($n && !in_array($n, $allowed) && !in_array($n, $stripped)){ 
      $toDelete[] = $child; 
      continue; 
     } 
     if($n && in_array($n, $stripped)){ 
      $attr = array(); 
      foreach($child->attributes as $a) 
       $attr[] = $a->nodeName; 
      foreach($attr as $a) 
       $child->removeAttribute($a); 
     } 
     clean($child, $allowed, $stripped); 
    } 
    foreach ($toDelete as $del) 
     $element->removeChild($del); 
} 

Это код для очистки строки:

$xhtml = '<p style="width: 250px;">This is some text<div class="button">This is the button</div><br><img src="waves.jpg" width="150" height="200" /></p><p><b>Title</b><br>Here is some more text and <a href="#" target="_blank">this is a link</a></p>'; 

$dom = new DOMDocument(); 
$dom->loadHTML($xhtml); 
$body = $dom->getElementsByTagName('body')->item(0); 
clean($body, array('img', 'a'), array('p', 'br', 'b')); 
echo preg_replace('#^.*?<body>(.*?)</body>.*$#s', '$1', $dom->saveHTML($body)); 

Вы должны проверить документацию для PHP's DOM classes

+0

Я был взволнован, когда увидел это, но он выводит странные символы на выходе. Например: Â (не уверен, что они пройдут) – John

+0

Возможно, это связано с кодировкой UTF-8. Можете ли вы представить пример ввода и вывода с «странными» символами? – FrankieTheKneeMan

+0

Данные чувствительны, есть ли способ передачи без публичного сообщения здесь публично? Можем ли мы отправить по электронной почте? – John

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