Вот еще один подход, основанный на этом комментарии Drupella на php.net, который хорошо работал для моего проекта. Он определяет innerHTML()
, создавая новый DOMDocument
, импортируя и добавляя к нему целевой узел вместо явной итерации по дочерним узлам.
InnerHTML
Давайте определим эту вспомогательную функцию:
function innerHTML( \DOMNode $n, $include_target_tag = true ) {
$doc = new \DOMDocument();
$doc->appendChild( $doc->importNode( $n, true ) );
$html = trim( $doc->saveHTML() );
if ( $include_target_tag ) {
return $html;
}
return preg_replace( '@^<' . $n->nodeName .'[^>]*>|</'. $n->nodeName .'>$@', '', $html );
}
где мы можем включить / исключить внешний целевой тег через второй входной аргумент.
Пример использования
Здесь мы извлекаем внутренний HTML-код для целевого тега, заданного атрибутом «first» id:
$html = '<div id="first"><h1>Hello</h1></div><div id="second"><p>World!</p></div>';
$doc = new \DOMDocument();
$doc->loadHTML( $html );
$node = $doc->getElementById( 'first' );
if ( $node instanceof \DOMNode ) {
echo innerHTML( $node, true );
// Output: <div id="first"><h1>Hello</h1></div>
echo innerHTML( $node, false );
// Output: <h1>Hello</h1>
}
Живой пример:
http://sandbox.onlinephpfunctions.com/code/2714ea116aad9957c3c437d46134a1688e9133b8