2015-04-09 1 views
0

Здравствуйте, я пытаюсь управлять DOMDocument из строки. Моя строка выглядит следующим образом:PHP - DOMDocument - получить предыдущий элемент и его атрибуты данных

$String = 
    <p> 
     <div class="ST" data-start="1" data-end="5"> 
      <span>WORD1</span><span>WORD2</span> 
     </div> 
    </p> 
    <p> 
     WORD3 WORD4 
    </p> 
    <p> 
     <div class="ST" data-start="6" data-end="10"> 
      <span>WORD5</span><span>WORD6</span> 
     </div> 
    </p> 

Моя цель состоит в том, чтобы положить слова WORD3 и WORD4 в <div> теге как WORD1WORD2 и WORD5WORD6 для первого и последнего <p> тегов. Кроме того, мне нужно получить data-startdata-end предыдущего p > div и получить, наконец, этот:

$String = 
     <p> 
      <div class="ST" data-start="1" data-end="5"> 
       <span>WORD1</span><span>WORD2</span> 
      </div> 
     </p> 
     <p> 
      <div class="ST" data-start="1" data-end="5"> 
       WORD3 WORD4 
      </div> 
     </p> 
     <p> 
      <div class="ST" data-start="6" data-end="10"> 
       <span>WORD5</span><span>WORD6</span> 
      </div> 
     </p> 

мне удалось поставить word3 и WORD4 в <div>, но я не знаю, как получить предыдущий элемент p > div и получить его атрибуты data-start и data-end ...

Мой код:

public function reverseTransform($value) { 

    $dom = new DOMDocument(); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = true; 
    $dom->loadHTML($value); 

    $pTags = $dom->getElementsByTagName('p'); 

    $TagFull=''; 
    foreach ($pTags as $pTag) { 
      $valuePTagFull = $this->DOMinnerHTML($pTag); 
      if (strpos($valuePTagFull,'<div') === false) { 
       $valuePTagFull = "<div class='st'>".$valuePTagFull."</div>"; 
      } 
      $TagFull .= $valuePTagFull; 

     } 
    } 

private function DOMinnerHTML(DOMNode $element) 
    { 
     $innerHTML = ""; 
     $children = $element->childNodes; 
     foreach ($children as $child) { 
      $innerHTML .= $element->ownerDocument->saveHTML($child); 
     } 
     return $innerHTML; 
    } 

В самом деле, для каждого <p>, которые имеют WORDx в но без <div>, я обернуть WORDx в <div> с data-start и data-end атрибутов предыдущего <p> >> <div>

Но как выбрать и получить атрибуты из предыдущего элемента с DOM, XML или другим способом?

Спасибо!

ответ

1

Я думаю, вы могли бы получить последние значения начала с регулярным выражением, но это не будет использовать DOM.

if (strpos($valuePTagFull,'<div') === false) { 
       $valuePTagFull = "<div class='st' data-start=".$matches[1]." data-end=".$matches[2].">".$valuePTagFull."</div>"; 
      } 
      else{ 
       preg_match('~<div[^>]*?class="ST"[^>]*?data-start="(\d*?)" data-end="(\d*?)">~',$valuePTagFull,$matches); 
      } 
      $TagFull .= $valuePTagFull; 
+0

привет! что такое «$ спички» на 2-й строке? – Zagloo

+0

@ Zagloo Свой массив, содержащий 2 целых числа, которые вам нужны. Однако это не очень хорошая практика, вы можете захотеть найти альтернативные способы получения атрибутов div. – Evan

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

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