как получить innerhtml по имени или имени, используя php

Привет, я загружаю контент из внешнего url. что-то вроде этого.

$html=get_data($external_url); 

где get_data () – это функция для получения контента с использованием curl.

теперь после этого я хочу получить внутренний html из разных html-элементов, таких как h1, div, p, span, используя их класс или id.

например, если содержимое из внешнего url ($ html) является чем-то вроде этого.

 <html> <title></title> <body> <h1 class="title">I am title</h1> <div id="content"> i am the content. </div> </body> 

теперь я хочу получить внутренний html тега html с классом = "title". Аналогично, я хочу получить внутренний html тега с id = "content"

Как это сделать, используя php? Я не знаю о DOM, XML. пожалуйста помоги.

Вот функция DOMDocument::saveHTML() . В текущих версиях php это может занять узел, который вы хотите сохранить как html. Чтобы сохранить внутренний html узла, вам необходимо сохранить каждый дочерний узел.

 function getHtml($nodes) { $result = ''; foreach ($nodes as $node) { $result .= $node->ownerDocument->saveHtml($node); } return $result; } 

Чтобы получить узлы, вы можете использовать Xpath. Идентификатор легко.

Получить все узлы элементов:

//*

которые имеют атрибут id "content"

//*[@id="content"]

Используйте только первый найденный узел, если кто-то добавил один и тот же идентификатор несколько раз.

//*[@id="content"][1]

Получить дочерние узлы – node () включает элемент, текст и несколько других узлов

//*[@id="content"][1]/node()

 $dom = new DOMDocument(); $dom->loadHTML($html); $xpath = new DOMXpath($dom); echo getHtml($xpath->evaluate('//*[@id="content"][1]/node()')); 

Атрибут класса немного сложнее. Атрибуты класса – это списки токенов, они могут содержать несколько имен классов. Вот трюк для их соответствия. Функция Xpath normalize-space () преобразует все группы пробелов в разделители одного пробела. Добавьте пространство впереди и до конца, и вы получите строку типа " one two three " . Теперь вы можете проверить, является ли " one " частью этой строки. В Xpath:

Нормализовать атрибут класса:

normalize-space(@class)

Добавить пробелы для начала и конца:

concat(" ", normalize-space(@class), " ")

Проверьте, содержит ли она подстроку

contains(concat(" ", normalize-space(@class), " "), " title ")

Используйте его для ограничения узлов

//*[contains(concat(" ", normalize-space(@class), " "), " title ")][1]/node()

Составлено:

 $html = <<<'HTML' <html> <title></title> <body> <h1 class="title">I am title</h1> <div id="content"> i am the <b>content</b>. </div> </body> HTML; $dom = new DOMDocument(); $dom->loadHTML($html); $xpath = new DOMXpath($dom); function getHtml($nodes) { $result = ''; foreach ($nodes as $node) { $result .= $node->ownerDocument->saveHtml($node); } return $result; } // first node with the id var_dump( getHtml( $xpath->evaluate('//*[@id="content"][1]/node()') ) ); // first node with the class var_dump( getHtml( $xpath->evaluate( '//*[contains(concat(" ", normalize-space(@class), " "), " title ")][1]/node()' ) ) ); // alternative - handling multiple nodes with the same class in a loop $nodes = $xpath->evaluate( '//*[contains(concat(" ", normalize-space(@class), " "), " title ")]' ); foreach ($nodes as $node) { var_dump(getHtml($xpath->evaluate('node()', $node))); } 

Выход: https://eval.in/118248

 string(40) " i am the <b>content</b>. " string(10) "I am title" string(10) "I am title" 

Это просто. Пытаться

 $dom_doc = new DomDocument(); $dom_doc->loadHTML($returned_external_html); $element = $dom_doc->getElementsByTagName('table'); // you can search for any tags like <img>, <p> and etc. This will return a DOMNodeList $element = $dom_doc->getElementById('specific_id'); // If you know the id of element you are seeking for try this. This will return a DOMElement //If I want to getINNERHTML for the table element, the code should be: $innerHTML= ''; $children = $element->childNodes; foreach ($children as $child) { $innerHTML .= $child->ownerDocument->saveXML( $child ); } echo $innerHTML; //contain the inner html of the element 

Проверьте эти ссылки для получения дополнительной информации.
DOMDocument GetElementsByTagName
DOMDocument GetElementById