2015-04-18 1 views
2

Я хочу удалить все теги <a> из строки.Удаление элементов без детей DOM PHP

так:

<a href="http://www.google.com"></a> 

, а не:

<a href="http://www.google.com">Not empty</a> 

Однако:

<a href="http://www.google.com"><img src="puppy.jpg" alt="Not empty"></a> 

удаляется, а также.

Редактировать: В основном изображения удаляются, поскольку они, похоже, имеют пустой nodeValue. Я хочу сохранить изображения. Почему nodeValue возвращается пустым, когда есть изображение между тегами <a>?

Вот моя попытка:

<?php 
$content_before=' 
so: 
<a href="http://www.google.com"></a> 

and not: 
<a href="http://www.google.com">Not empty</a> 

However: 
<a href="http://www.google.com"><img src="puppy.jpg" alt="Not empty"></a> 
'; 
$dom=new domDocument; 
@$dom->loadHTML($content_before); 
$dom->preserveWhiteSpace = true; 

$anchors=$dom->getElementsByTagName('a'); 
foreach($anchors as $a) 
{ 
    $as[] = $a; 
} 
foreach($as as $a) 
{ 
    $nodevalue=$a->nodeValue; 
    $nodevalue=trim($nodevalue); 

    if(empty($nodevalue)&&is_object($a)) 
    { 
     #remove links without nodevalues 
     $a->parentNode->removeChild($a); 
    } 
} 
$content=$dom->saveHTML(); 
echo 'before:<br><textarea>'.$content_before.'</textarea>'; 
echo 'after<br><textarea>'.$content.'</textarea>'; 

#what $content becomes: 
$content=' 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><p>so: 


and not: 
<a href="http://www.google.com">Not empty</a> 

However: 
</p></body></html>'; 

#What I want it to be: 
$content_after=' 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><p>so: 

and not: 
<a href="http://www.google.com">Not empty</a> 

However: 
<a href="http://www.google.com"><img src="puppy.jpg" alt="Not empty"></a> 
</p></body></html>'; 
?> 
+0

Какой должен быть ваш окончательный/желаемый результат? можете ли вы добавить дополнительную информацию в свой вопрос.? –

ответ

1

Другим способом был бы использовать xpath обработку запросов, а затем получить все элементы, которые не имеют/пустые детей. После этого, удалите все эти элементы с регрессом:

$dom = new DomDocument; 
@$dom->loadHTML($content_before); 
$dom->preserveWhiteSpace = true; 
$xpath = new DOMXpath($dom); 

$empty_anchors = $xpath->evaluate('//a[not(*) and not(text()[normalize-space()])]'); 
$i = $empty_anchors->length - 1; 
while ($i > -1) { 
    $element = $empty_anchors->item($i); 
    $element->parentNode->removeChild($element); 
    $i--; 
} 

echo $dom->saveHTML(); 
1

Вы можете проверить, если firstChild существует, просто измените свой foreach цикл для:

foreach($as as $a) 
{ 
    if($a->firstChild === NULL && is_object($a)) 
    { 
     #remove links without nodevalues 
     $a->parentNode->removeChild($a); 
    } 
} 

FirstChild

Первый ребенок этого узел. Если такого узла нет, возвращается NULL

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

  • Нет связанных вопросов^_^