Вот функция strip_tags_ex, которую я написал на днях (фактически только вчера). Это позволяет вам указать теги, из которых должен быть удален весь контент. Он также позволяет указывать теги, атрибуты которых должны быть сохранены в результирующем тексте.
Возможно, это не совсем то, что вам нужно, но, по крайней мере, покажет вам, как пройти по дереву DOM и проверить каждый тег и атрибут элемента.
Извините за комментарии на голландском. Хотя код достаточно понятен.
<?php
/**
* Helper function. Extraheert recursief tekst uit een DOMNode, met inachtneming van de opgegeven regels.
*/
function extract_text_from_node(DOMNode $node, &$index_attrs, &$remove_elements, array &$output)
{
if ($node->nodeType == XML_TEXT_NODE)
{
// Huidige node is een tekstnode. Tekst outputten.
$output[] = $node->data;
}
else
{
if ($node->nodeType == XML_ELEMENT_NODE)
{
// Huidige node is een element. Speciale behandeling;
if (array_search($node->tagName, $remove_elements) !== false)
{
// Element staat in de lijst met uitzonderingen. Verder negeren.
return;
}
if (array_key_exists($node->tagName, $index_attrs))
{
// Element staat in de lijst van tags waarvan ook attributen geëxporteerd moeten worden.
$prefixed = false;
// Voor elk opgegeven attribuut controleren of het bestaat.
foreach($index_attrs[$node->tagName] as $attribute)
{
$value = $node->getAttribute($attribute);
if ($value !== '')
{
// Attribuut gevonden. Outputten.
// Sommige tags voorzien van extra prefex, zodat de tekst van de attributen
// wat meer context krijgt in de uiteindelijke platte tekst.
if ($prefixed === false)
{
switch ($node->tagName)
{
case 'img': $output[] = 'Afbeelding: '; break;
case 'a': $output[] = 'Link: '; break;
default: break;
}
$prefixed = true;
}
// Attribute teruggeven met spaties er omheen.
$output[] = ' '.$value.' ';
}
}
}
}
// Willekeurige node. Als ie children heeft, dan recursief aanroepen.
$child = $node->firstChild;
while ($child)
{
extract_text_from_node($child, $index_attrs, $remove_elements, $output);
$child = $child->nextSibling;
}
}
}
/**
* strip_tags_ex extraheert tekst uit een html string.
* @param string $string. De HTML code om in te zoeken
* @param array $index_attrs. De elementen waarvan attributen ook teruggegeven moeten worden.
* In de vorm array(tag=>array(attribute,...),...)
* $param array of string $remove_elements. Array van elementen die helemaal, inclusief inhoud, genegeerd moeten worden.
*/
function strip_tags_ex($string, $index_attrs, $remove_elements)
{
$dom = new DOMDocument;
// Eventuele warning (die ontstaan bij ongeldige HTML) onderdrukken.
@$dom->loadHTML($string);
$output = array();
$root = $dom->documentElement;
// Tekst uit rootnode extraheren.
extract_text_from_node($root, $index_attrs, $remove_elements, $output);
// Resultaat-array samenvoegen tot een string.
return implode('', $output);
}
$string = 'Hallo wereld';
echo strip_tags_ex(
$string,
array(
'a'=>array('alt', 'title'),
'img'=>array('alt')),
array('div'));