как отделить выбранные теги от содержимого html

У меня есть html, как

 <span class="address">
   <h1>Dr. Maria Steffens</h1>
   <h4>Institute of Medico</h4>
   <h4></h4>
   <h4></h4>
   <p>Sta. Ana, strt PH-501</p>
   <p>1062 Caracas</p>
   <p>France</p>
  <br>
   <p>Telefon: +58-457-2889567</p>
   <p><a href="mailto:[email protected]">[email protected]</a></p>
   <p><a href="http://">www.mysite.com</a></p>
</span>

Теперь я хочу разделить каждый тег, например

<h1>Dr. Maria Steffens</h1>

или возникновения

<h4></h4> tag

Я пытался

$html = new DOMDocument();
@$html->loadHtmlFile('http://www.sitetofetch.com');
$xpath = new DOMXPath( $html );
$nodelist = $xpath->query( "//*[@class='address']" );

foreach ($nodelist as $n){
  $newhtml = $html->saveHtml($n)."\n";
  $newhtml = htmlentities($newhtml);

$items = $html->getElementsByTagName('h1');
}

но он не работает должным образом,

Как я могу это сделать.


person Adas    schedule 11.07.2016    source источник
comment
Можете ли вы описать это немного подробнее, то, чего вы хотите достичь? Мне пока не очень ясно.   -  person Gerrit Luimstra    schedule 11.07.2016
comment
Я очистил html ‹span class=address›....‹/span›, теперь любой тег, который я выберу, например ‹h1›xyz‹/h1›. это даст мне xyz. и если я выберу ‹p›pqr‹/p›. это даст мне pqr.   -  person Adas    schedule 11.07.2016
comment
Regex не предпочтительнее для анализа html. Этот вопрос, например, получает эти теги из html-документа через getElementsByTagName().   -  person LukStorms    schedule 11.07.2016
comment
и например, если я хочу содержимое второго тега p, тогда это даст мне 1062 Caracas   -  person Adas    schedule 11.07.2016
comment
Что вы пытаетесь достичь? Затем вы можете решить, подходит ли PHP или JavaScript...   -  person John Strood    schedule 11.07.2016
comment
Если вы пытаетесь отобразить контент на веб-странице, например, текст с цветовым кодом по тегам, тогда JS подходит. В противном случае, если вы пытаетесь отправить данные на сервер, лучше всего подойдет форма.   -  person John Strood    schedule 11.07.2016
comment
Мне нужен только тег html.   -  person Adas    schedule 11.07.2016
comment
даже getElementsByTagName('h1') не работает.   -  person Adas    schedule 11.07.2016
comment
попробуйте использовать нативную DOM ссылка   -  person Ramkumar P    schedule 11.07.2016
comment
Пожалуйста, проверьте еще раз, так как я отредактировал то, что пробовал снова.   -  person Adas    schedule 11.07.2016
comment
вышеприведенный контент html уже получен из очистки с использованием xpath. что мне нужно сделать, это отделить каждый HTML-тег от этих захваченных данных.   -  person Adas    schedule 11.07.2016
comment
Я нашел решение stackoverflow.com/questions/18800807/, автор @Kilise   -  person Adas    schedule 11.07.2016


Ответы (1)


Как уже упоминалось, вместо этого используйте синтаксический анализатор.
Следующий фрагмент загружает ваш HTML в DOM и применяет к нему запросы xpath. Очевидно, их нужно немного подправить, но для распечатки «Доктор Мария Стеффенс» работает следующее:

<?php

$data = <<<DATA
<span class="address">
   <h1>Dr. Maria Steffens</h1>
   <h4>Institute of Medico</h4>
   <h4></h4>
   <h4></h4>
   <p>Sta. Ana, strt PH-501</p>
   <p>1062 Caracas</p>
   <p>France</p>
  <br>
   <p>Telefon: +58-457-2889567</p>
   <p><a href="mailto:[email protected]">[email protected]</a></p>
   <p><a href="http://">www.mysite.com</a></p>
</span>
DATA;

$dom = new DOMDocument();
$dom->loadHTML($data);

$xpath = new DOMXPath($dom);
$headers = $xpath->query("//h1");
foreach ($headers as $header) {
    echo $header->nodeValue;
}
?>

См. демонстрацию на ideone.com.


Что касается вашего первоначального вопроса, почему это не сработало, давайте разобьем ваше выражение на части:

<h1    # match <h1 literally
\s     # followed by one whitespace character (space, tab, newline)
[^>]*  # followed by anything not >, zero or more times
>      # followed by >
(.*)   # anything in that line afterwards
<\/h1> # followed by </h1>

Проблема в том, что после <h1 и > нет пробелов, поэтому выражение не будет выполнено.

person Jan    schedule 11.07.2016
comment
содержимое html уже исходит из очистки с использованием xpath. что мне нужно сделать, это отделить каждый HTML-тег от этих захваченных данных. - person Adas; 11.07.2016
comment
Я думаю, что моя проблема не слишком сложна, это может быть просто трюк, мне просто нужен тег типа ‹p›xyz‹/p› из html. - person Adas; 11.07.2016