Выберите nodeValue, но исключаем дочерние элементы.

Предположим, у меня есть этот код:

<p dataname="description"> Hello this is a description. <a href="#">Click here for more.</a> </p> 

Как выбрать nodeValue из p но исключить a и его содержимое?

Мой текущий код:

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

Я выбираю его по $result->item(0)->nodeValue;

Просто добавление / текст () в ваш запрос должно сделать трюк

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

Непонятно, поддерживает ли XPath XPath это, но этот XPath делает трюк для меня в Scrapy (основанная на Python схема скремблирования):

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

Если это не сработает, попробуйте решение Kristoffers, или вы также можете использовать регулярное выражение. Например:

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

Это приведет к удалению любого тега HTML с любым содержимым в нем, за исключением текста, который не инкапсулирован тегами HTML.