2012-06-22 7 views
4

У меня есть веб-страница, которую я хотел бы изменить по коду (добавив ссылку на определенные слова).Xpath для выбора узлов без его дочерних элементов

HTML-код:

<div class="section"> 
<h2>Notre histoire</h2> 
<p style="text-align: justify;">SPECIFICS WORDS<strong>1998 : la création</strong></p> 
<p style="text-align: justify;">pour objectif « de promouvoir, selon une démarche d’éducation active, auprès des jeunes et à travers eux, des projets d’expression collective et d’action de solidarité » (article 2).<br><br><strong>1999-2001 : les débuts SPECIFICS WORDS</strong></p> 
<p style="text-align: justify;">SPECIFICS WORDS<a href="#">SPECIFICS WORDS</a></p> 
</div> 

Так что моя цель состоит в том, чтобы preg_replace на конкретные слова, а только те, которые находятся в Р, а из из А или STRONG, или любой либо метки.

Я не могу использовать какой-либо класс или любой идентификатор, потому что я не знаю код раньше! Я пробовал функцию preg_replace PHP, но это не сработало и слишком долго исполнялось.

Так что мой вопрос: Как выбрать с XPATh узел без его A, STRONG, IMG chidrens?

+0

Мое первое впечатление заключается в том, что если вы не используете XHTML и можете гарантировать отсутствие специальных символов (например, ' '), у вас возникнут проблемы с обработкой через XPATH, так как это должно было бы подтвердите стандарты XML. Я мог ошибаться, хотя (было известно!) – freefaller

+0

В общем случае выражение XPath для выбора узла, находящегося в A, но не в B, является 'A // node() [not (ancestor :: B)]' Если вы хотите текстовых узлов, вам нужно заменить 'node()' на 'text()'. – biziclop

ответ

2

Вы не можете выбирать узлы без их детей. Узел является частью дерева, если только он не является листом, и в этом случае у него нет детей. Для того, чтобы выбрать листья TextNode, содержащие слово «КОНКРЕТНЫЕ», которые являются прямыми потомками P элементов, вы

//p/text()[contains(.,'SPECIFIC')] 

Это позволит исключить текстовые узлы внутри других элементов, например, в сильном или a.

Чтобы заменить их, вы

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//p/text()[contains(.,"SPECIFIC")]') as $textNode) { 
    $textNode->nodeValue = "REPLACED"; 
} 
echo $dom->saveHTML(); 

Также см DOMDocument in php и это XPath Tutorial

0

Если я правильно понимаю, вы хотите, чтобы выбрать все узлы в Xml документе, являются прямыми потомками в <p> элемента , без каких-либо других элементов между ними. Это возможно следующим образом:

`//p/node()[not(self::*)]` 

Это выражение выбирает

  1. во всех <p> элементов
  2. непосредственные дочерние узлы (без каких-либо промежуточных уровней)
  3. , если они не являются элементами.
Смежные вопросы