As discussed, the best way to handle HTML text in PHP is to use the DOMDocument
. You can load an HTML page into a DOMDocument
object as follows:
$dom = new DOMDocument();
$dom->loadHTML($html);
Being $html
the contents of the file to be parsed. Since it is only desired to obtain the contents of the body of the file, we can obtain the node referring to body
as follows:
$body = $dom->getElementsByTagName("body")->item(0);
Being $body
an object DOMNode
. You can verify that the element has child elements by using the hasChildNodes
method and traverses them using the childNodes
attribute. This way, we can create a recursive function that extracts the text from all nodes of the page:
/**
* Obtém o texto presente em um arquivo HTML, retornando-o em forma de lista.
*
* @param DOMNode $element Elemento de onde será extraído o texto.
* @param array $texts Lista de textos previamente obtidos.
* @return array Lista de textos obtidos no elemento.
*/
function getTextsOfElements(DOMNode $element, array $texts = [])
{
// Verifica se o elemento possui elementos filhos:
if ($element->hasChildNodes()) {
// Sim, então percorre todos os elementos filhos de forma recursiva:
foreach ($element->childNodes as $e) {
// Obtém os textos dos elementos filhos:
$texts = getTextsOfElements($e, $texts);
}
} else {
// Não, então verifica se o elemento é um texto:
if ($element->nodeType == 3) {
// Sim, remove os espaços em branco:
$text = trim($element->nodeValue);
// Verifica se o texto não é vazio:
if ($text) {
// Sim, então adiciona o texto à lista:
$texts[] = $text;
}
}
}
// Retorna a lista de textos:
return $texts;
}
So, to get the list of texts, just call the function passing the object $body
as a parameter:
print_r(getTextsOfElements($body));
If the entry is the one specified in the question (complete HTML):
$html = '<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>
<div>
texto1
<a>texto2</a>
<b>texto3</b>
</div>
texto4
</div>
</body>
</html>';
The output will be:
Array
(
[0] => texto1
[1] => texto2
[2] => texto3
[3] => texto4
)
See working at Repl.it .