2014-10-23 2 views
-1

Заголовок говорит все. Как получить текст между узлами HTML с помощью PHP? Есть идеи? Ниже представлена ​​моя структура HTML.PHP Получение текста между узлами HTML

<html> 
<head> 
    <title>Test Page</title> 
</head> 
<body> 
    <div id="outer"> 
     <div id="first"> 
      <p class="this">Hello</p> 
      <p class="this">Community</p> 
     </div> 
     <div id="second"> 
      <p class="that">Stack</p> 
      <p class="that">Overflow</p> 
     </div> 
    </div> 
</body> 

Ожидаемый результат:

HelloStackOverflowCommunity 
+2

Используйте библиотеку парсера HTML, например 'DOMDocument' или' PHP Simple HTML DOM'. – Barmar

+0

Не рекомендуется использовать регулярное выражение для анализа HTML. – Efog

+0

Есть ли что-нибудь, что вы пробовали? Если бы вы могли опубликовать код. –

ответ

0

Я бы порекомендовал вам использовать PHP встроенные DOMDocument, а не класс третьей стороны, как simplehtmldom.

В больших файлах HTML они очень медленные (я работал с ними).

<?php 
$html =' 
<html> 
<head> 
    <title>Test Page</title> 
</head> 
<body> 
    <div id="outer"> 
     <div id="first"> 
      <p class="this">Hello</p> 
      <p class="this">Community</p> 
     </div> 
     <div id="second"> 
      <p class="that">Stack</p> 
      <p class="that">Overflow</p> 
     </div> 
    </div> 
</body> 
'; 

// a new dom object 
$dom = new domDocument; 
$dom->preserveWhiteSpace = false; 

// load the html into the object 
$dom->loadHTML($html); 
// get the body tag 
$body = $dom->getElementsByTagName('body')->item(0); 
// loop through all tags 
foreach($body->getElementsByTagName('*') as $element){ 
    // print the textValue 
    print $element->firstChild->textContent; 
} 

Выходной сигнал будет HelloCommunity StackOverflow

-1

Попробуйте один

function getTextBetweenTags($string, $tagname) 
{ 
    $pattern = "/<$tagname>(.*?)<\/$tagname>/"; 
    preg_match($pattern, $string, $matches); 
    return $matches[1]; 
} 

Вы должны циклу через $ соответствует массиву ...

+2

[Вы не можете анализировать HTML с регулярным выражением] (http://stackoverflow.com/a/1732454/927408). – jurgemaister

+0

@jurgemaister проклятье, избили меня! – GordonM

0

Вы можете попробовать:

$text = strip_tags($html); 

http://www.php.net/manual/en/function.strip-tags.php

Это поможет вам довольно далеко. Он оставляет пробелы и возвращает, но их легко удалить.

$clean = str_replace(array(' ',"\n","\r"),'',$text); 

http://www.php.net/manual/en/function.str-replace.php

Использование его на вашем примере дает:

TestPageHelloCommunityStackOverflow 

Если вы хотите оставить некоторые пробелы нетронутыми вы могли бы вместо того, чтобы попробовать:

$clean = trim(implode('',explode("\n",$text))); 

что приводит к:

Test Page Hello Community Stack Overflow 

Возможны многие варианты.

0

Регулярные выражения настоятельно не рекомендуется анализировать HTML.
Использование простого HTML библиотека: http://sourceforge.net/projects/simplehtmldom/files/simplehtmldom/
Включите его: include 'simple_html_dom.php';
Получить тег вам необходимо: $tags = $html->find('p');
Создать массив: $a = array(); foreach ($tags as $tag) $a[] = $tag->innertext;;
Создайте свою строку: $string = $a[0] . $a[2] . $a[3] . $a[1];

1

Это довольно просто, получить PHP Simple HTML DOM Parser здесь: http://sourceforge.net/projects/simplehtmldom/files/

Затем используйте следующий код:

/* include simpledom*/ 
include('simple_html_dom.php'); 

/* load html string */ 
$html_string = <<<HTML 
<html> 
<head> 
    <title>Test Page</title> 
</head> 
<body> 
    <div id="outer"> 
     <div id="first"> 
      <p class="this">Hello</p> 
      <p class="this">Community</p> 
     </div> 
     <div id="second"> 
      <p class="that">Stack</p> 
      <p class="that">Overflow</p> 
     </div> 
    </div> 
</body> 
</html> 
HTML; 

/* create simple dom object from html */ 
$html = str_get_html($html_string); 

/* find all paragraph elements */ 
$paragraph = $html->find('div[id=outer] div p'); 

/* loop through all elements and get inner text */ 
foreach($paragraph as $p){ 
    echo $p->innertext; 
} 

Приветствия,

Roy

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