Seleccione nodeValue pero excluya elementos secundarios

Digamos que tengo este código:

Hello this is a description. Click here for more.

¿Cómo selecciono el nodeValue de p pero excluyo a y su contenido?

Mi código actual:

 $result = $xpath->query("//p[@dataname='description'][not(self::a)]"); 

Lo selecciono por $result->item(0)->nodeValue;

Solutions Collecting From Web of "Seleccione nodeValue pero excluya elementos secundarios"

Simplemente agregando / texto () a su consulta debería hacer el truco

 $result = $xpath->query("//p[@dataname='description'][not(self::a)]/text()"); 

No estoy seguro de si XPath de PHP es compatible con esto, pero este XPath me hace el truco en Scrapy (framework de scraping basado en Python):

 $xpath->query('//p[@dataname='description']/text()[following-sibling::a]') 

Si esto no funciona, pruebe la solución de Kristoffers, o también podría usar una solución de expresiones regulares. Por ejemplo:

$output = preg_replace("~< .*?>.*?< .*?>~msi", '', $result->item(0)->nodeValue);

Esto eliminará cualquier etiqueta HTML con contenido, sin incluir texto que no esté encapsulado en tags HTML.